JPA where in查询的问题

Eternalc 2013-06-08 09:59:43
我的业务场景是这样的,我有一个流程节点,有对应的状态
节点1,状态1,状态2,状态3
节点2,状态4
...

所以,我们的ql = "select e from Entity e where e.status in (:status)";

这个in里面的内容,需要动态的决定说是否进行查找,可能是1个参数,可能是3个参数。

我在网络上查询,发现jpa可以对集合进行操作

引用
“9.JPA的集合查询:

我们知道在SQL语句中,查找某元素是否在某个集合中时常用类似:in(a,b,c)的查询语句,在JDBC中我们常常需要将集合元素拼接成以逗号(“,”)分隔的字符串,在JPA中有两种方法可以方便地进行判断元素是否在集合中的查询:

(1).设置集合类型的参数:
查询对象的setParameter方法支持Object类型,因此可以传入一个集合类型的参数,如数组或者ArrayList等。
例如:
Query query = em.createQuery(“select * from Users where name in(?names)”);
query.setParameter(“name”, names);//names是一个name集合

(2).使用member of关键字:
例如:
Select t from Topic t where :option member of t.options;”


问题是,如果我传入一个String[] statusArr 或者List<String> 时,都报出异常。请问jpa里的in查询的到底怎么用? member 不能查,直接报 unexpect token
当然,如果实在没办法,我只能去用程序去拼接 in 的部分了。这是最下策了。
...全文
10077 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
西夏一品堂 2014-09-18
  • 打赏
  • 举报
回复
楼主解决了吗?怎么解决的 我也碰到这个问题了?
_serendipity_ 2014-02-22
  • 打赏
  • 举报
回复
在相应字段的get方法里把不要的数据过滤掉。这样做虽然效率低一点,但是不依赖具体的JPA实现。通用性好。
yrsheng 2014-02-18
  • 打赏
  • 举报
回复
经测试,可以的啊,楼上的正确。
Felomeng 2014-01-03
  • 打赏
  • 举报
回复
直接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的
引用 楼主 Eternalc 的回复:
我的业务场景是这样的,我有一个流程节点,有对应的状态 节点1,状态1,状态2,状态3 节点2,状态4 ... 所以,我们的ql = "select e from Entity e where e.status in (:status)"; 这个in里面的内容,需要动态的决定说是否进行查找,可能是1个参数,可能是3个参数。 我在网络上查询,发现jpa可以对集合进行操作
引用
“9.JPA的集合查询: 我们知道在SQL语句中,查找某元素是否在某个集合中时常用类似:in(a,b,c)的查询语句,在JDBC中我们常常需要将集合元素拼接成以逗号(“,”)分隔的字符串,在JPA中有两种方法可以方便地进行判断元素是否在集合中的查询: (1).设置集合类型的参数: 查询对象的setParameter方法支持Object类型,因此可以传入一个集合类型的参数,如数组或者ArrayList等。 例如: Query query = em.createQuery(“select * from Users where name in(?names)”); query.setParameter(“name”, names);//names是一个name集合 (2).使用member of关键字: 例如: Select t from Topic t where :option member of t.options;”
问题是,如果我传入一个String[] statusArr 或者List<String> 时,都报出异常。请问jpa里的in查询的到底怎么用? member 不能查,直接报 unexpect token 当然,如果实在没办法,我只能去用程序去拼接 in 的部分了。这是最下策了。
sky663 2013-07-01
  • 打赏
  • 举报
回复
靠,搞个in 参数如此麻烦,跟拼原生SQL有何区别,我还要这破框架做什!!!
Jack_Chai 2013-06-14
  • 打赏
  • 举报
回复
引用 2 楼 ZuxiangHuang 的回复:
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();
在Hibernate 4.1之后吧(具体哪个版本记不清了),对这种以数字序为参数占位符的查询语句会提示警告,不推荐此方式了。我的项目已经全部升级为命名参数 :paramName 这种形式了。
zuxianghuang 2013-06-13
  • 打赏
  • 举报
回复
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();
Jack_Chai 2013-06-13
  • 打赏
  • 举报
回复
我勒个去,参数不是这样传递的。。。 你可以先判断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()

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧