问题描述:

我使用mybatis操作pgsql数据库,查询语句如下:

<select id="selectMovieListByActorId" parameterType="java.lang.Integer" resultType="team.first.movie_api.domain.Movie">
      select * from movie_db.movie where id in (
          select movie_id from movie_with_actor where actor_id = ${id,jdbcType=INTEGER})
</select>

我的mapper接口方法是

List<Movie> selectMovieListByActorId(Integer id);

数据库中表的字段都为int4,没有varchar类型


执行报错:

### Error querying database.  Cause: org.postgresql.util.PSQLException: 错误: 操作符不存在: character varying = integer
  建议:没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换.
  位置:107
### The error may exist in file [E:\实用数据库开发\project\movie-api-boot\target\classes\mapper\ActorMapper.xml]
### The error may involve team.first.movie_api.mapper.ActorMapper.selectMovieListByActorId-Inline
### The error occurred while setting parameters
### SQL: select * from movie_db.movie where id in (select movie_id from movie_with_actor where actor_id = 1031862)
### Cause: org.postgresql.util.PSQLException: 错误: 操作符不存在: character varying = integer
  建议:没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换.
  位置:107

将传参部分${} 换为 #{}还是报同样的错


数据库结构如下:

在这里插入图片描述


问题分析:

  1. 首先我的表不存在varchar类型,方法的传参也都是Integer,所以问题应该不是出在vharchar = integer
  2. 仔细检查sql语句发现内嵌查询没有给表名前加模式名movie_db
  3. 将原本语句更改如下,问题解决
    <select id="selectMovieListByActorId" parameterType="java.lang.Integer" resultType="team.first.movie_api.domain.Movie">
          select * from movie_db.movie where id in (
              select movie_id from movie_db.movie_with_actor where actor_id = ${id,jdbcType=INTEGER})
    </select>
    
  4. 解决办法2:将数据库全部放在public下,这样就可以免去在表明前添加模式名的麻烦,而且不易出错

总结:数据库的查询语句应该指明具体的表的位置(如果有多个模式,前面加上模式名),不指明模式的话就会默认去public模式下查找,从而报错。


总总结:这就是个很基本的错误,居然搞了好久才发现问题,我真傻,真的 =_=!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐