我勒个去,参数不是这样传递的
你可以先判断List<String>的length(),然后再拼接参数:
StringBuffer jpql= new StringBuffer();
jpql.append("select e from Entity e where e.status in (");
for(int i=0;i<list.length();i++){
 jpql.append(":status"+i+",");
}
if (!list.isEmpty()){
 jpql.deleteCharAt(jpql.length()-1);
}
jpql.append(")");
得到相应的query之后再setParameter:
for(int i=0;i<list.lenght(); i++){
 query.setParameter("status"+i, list.get(i));
}然后就去执行就可以了,注意jpql作为StringBuffer要.toString()

解决方案 »

  1.   

    jpa的in查询不能用数组或集合,只能一个一个参数的设置,用这个来解决挺好的list 查询条件的参数集合;org.apache.commons.lang.StringUtils;        StringBuffer jpql = new StringBuffer(
                    "SELECT o FROM xx as o WHERE o.xx IN (");
            jpql.append( StringUtils.repeat(" ? ", ",", listSize));
            jpql.append(") ");Object[] queryParams= list.toArray();
                Query query = entityManager.createQuery(jpql.toString);
                       if (queryParams != null && queryParams.length > 0)
            {
                for (int i = 0; i < queryParams.length; i++)
                {
                    query.setParameter(i + 1, queryParams[i]);
                }
            }
                return  query.getResultList();
      

  2.   

    在Hibernate 4.1之后吧(具体哪个版本记不清了),对这种以数字序为参数占位符的查询语句会提示警告,不推荐此方式了。我的项目已经全部升级为命名参数 :paramName 这种形式了。
      

  3.   

    靠,搞个in 参数如此麻烦,跟拼原生SQL有何区别,我还要这破框架做什!!!
      

  4.   

    直接set无异常
    这句:
    Query query = em.createQuery(“select * from Users where name in(?names)”);
    query.setParameter(“name”, names);//names是一个name集合
    应该改成:
    Query query = em.createQuery(“select * from Users where name in(:names)”);//?改成:
    query.setParameter(“names”, names);//name改成names,这样才对,否则jpa是无法把name map到names的
    问题是,如果我传入一个String[] statusArr 或者List<String> 时,都报出异常。请问jpa里的in查询的到底怎么用? member 不能查,直接报 unexpect token 
    当然,如果实在没办法,我只能去用程序去拼接 in 的部分了。这是最下策了。
      

  5.   

    在相应字段的get方法里把不要的数据过滤掉。这样做虽然效率低一点,但是不依赖具体的JPA实现。通用性好。