• JPA使用in查询只能查询到第一个参数结果的坑


    错误前:

    @Service
    String ids = "1,2,3,4,5";
    this.UserDao.getUsers(ids);
    
    @Repository
    //报错
    /*
    org.springframework.dao.InvalidDataAccessApiUsageException: 
    Parameter value [1,2,3,4] did not match expected type [java.lang.Integer (n/a)]; 
    nested exception is java.lang.IllegalArgumentException: 
    Parameter value [1,2,3,4] did not match expected type [java.lang.Integer (n/a)]
    */
    @Query("SELECT s from User s WHERE s.id IN(:ids)")
    List<User> getUsers(@Param("ids") String ids);
    
    //强行执行自定义sql
    @Query(nativeQuery = true, value = "SELECT * from User WHERE id IN(?1)")
    List<User> getUsers(@Param("ids") String ids);
    
    强行执行自定义sql之后,你会发现,结果和预期不一致
    放到sqlyog里面执行自定义sql
    SELECT * from User WHERE id IN(1,2,3,4,5);
    发现结果没错。错在哪里吗?
    放到sqlyog里面执行
    SELECT * from User WHERE id IN(”1,2,3,4,5“);
    结果和程序神奇的一致,只查询id=1的一条记录,问题就在这里,有引号!!!
    

      

    修改后:

    @Service
    String ids = "1,2,3,4,5";
    List<Integer> userIds = new ArrayList<>();
    String[] userArray = ids.split(",");
    for(String id : userArray){
        userIds.add(Integer.parseInt(id));
    }
    this.UserDao.getUsers(userIds);
    
    @Repository
    @Query("SELECT s from User s WHERE s.id IN(:ids)")
    List<User> getUsers(@Param("ids") List<Integer> ids);
    
    问题解决!!!
    

      

  • 相关阅读:
    使用yeoman搭建脚手架并发布到npm
    Facebook的一些基本操作(网页版)
    Egg中使用egg-mongoose和常用的Mongoose 方法
    Vuex的使用
    跨浏览器的javascript事件的封装
    利用ngnix解决跨域问题
    webpack打包工具
    用vue-cli脚手架搭建一个仿网易云音乐的全家桶vue项目
    mac 解决mysqlclient安装失败问题
    linux之wget
  • 原文地址:https://www.cnblogs.com/i-tao/p/12394311.html
Copyright © 2020-2023  润新知