JPA where in查询的问题

问题描述

我的业务场景是这样的,我有一个流程节点,有对应的状态节点1,状态1,状态2,状态3节点2,状态4...所以,我们的ql="selectefromEntityewheree.statusin(:status)";这个in里面的内容,需要动态的决定说是否进行查找,可能是1个参数,可能是3个参数。我在网络上查询,发现jpa可以对集合进行操作引用

“9.JPA的集合查询:我们知道在SQL语句中,查找某元素是否在某个集合中时常用类似:in(a,b,c)的查询语句,在JDBC中我们常常需要将集合元素拼接成以逗号(“,”)分隔的字符串,在JPA中有两种方法可以方便地进行判断元素是否在集合中的查询:(1).设置集合类型的参数:查询对象的setParameter方法支持Object类型,因此可以传入一个集合类型的参数,如数组或者ArrayList等。例如:Queryquery=em.createQuery(“select*fromUserswherenamein(?names)”);query.setParameter(“name”,names);//names是一个name集合(2).使用memberof关键字:例如:SelecttfromTopictwhere:optionmemberoft.options;”

问题是,如果我传入一个String[]statusArr或者List<String>时,都报出异常。请问jpa里的in查询的到底怎么用?member不能查,直接报unexpecttoken当然,如果实在没办法,我只能去用程序去拼接in的部分了。这是最下策了。

解决方案

解决方案二:
我勒个去,参数不是这样传递的。。。你可以先判断List<String>的length(),然后再拼接参数:StringBufferjpql=newStringBuffer();jpql.append("selectefromEntityewheree.statusin(");for(inti=0;i<list.length();i++){jpql.append(":status"+i+",");}if(!list.isEmpty()){jpql.deleteCharAt(jpql.length()-1);}jpql.append(")");得到相应的query之后再setParameter:for(inti=0;i<list.lenght();i++){query.setParameter("status"+i,list.get(i));}然后就去执行就可以了,注意jpql作为StringBuffer要.toString()
解决方案三:
jpa的in查询不能用数组或集合,只能一个一个参数的设置,用这个来解决挺好的list查询条件的参数集合;org.apache.commons.lang.StringUtils;StringBufferjpql=newStringBuffer("SELECToFROMxxasoWHEREo.xxIN(");jpql.append(StringUtils.repeat("?",",",listSize));jpql.append(")");Object[]queryParams=list.toArray();Queryquery=entityManager.createQuery(jpql.toString);if(queryParams!=null&&queryParams.length>0){for(inti=0;i<queryParams.length;i++){query.setParameter(i+1,queryParams[i]);}}returnquery.getResultList();
解决方案四:
引用2楼ZuxiangHuang的回复:

jpa的in查询不能用数组或集合,只能一个一个参数的设置,用这个来解决挺好的list查询条件的参数集合;org.apache.commons.lang.StringUtils;StringBufferjpql=newStringBuffer("SELECToFROMxxasoWHEREo.xxIN(");jpql.append(StringUtils.repeat("?",",",listSize));jpql.append(")");Object[]queryParams=list.toArray();Queryquery=entityManager.createQuery(jpql.toString);if(queryParams!=null&&queryParams.length>0){for(inti=0;i<queryParams.length;i++){query.setParameter(i+1,queryParams[i]);}}returnquery.getResultList();

在Hibernate4.1之后吧(具体哪个版本记不清了),对这种以数字序为参数占位符的查询语句会提示警告,不推荐此方式了。我的项目已经全部升级为命名参数:paramName这种形式了。
解决方案五:
靠,搞个in参数如此麻烦,跟拼原生SQL有何区别,我还要这破框架做什!!!
解决方案六:
直接set无异常这句:Queryquery=em.createQuery(“select*fromUserswherenamein(?names)”);query.setParameter(“name”,names);//names是一个name集合应该改成:Queryquery=em.createQuery(“select*fromUserswherenamein(:names)”);//?改成:query.setParameter(“names”,names);//name改成names,这样才对,否则jpa是无法把namemap到names的引用楼主Eternalc的回复:

我的业务场景是这样的,我有一个流程节点,有对应的状态节点1,状态1,状态2,状态3节点2,状态4...所以,我们的ql="selectefromEntityewheree.statusin(:status)";这个in里面的内容,需要动态的决定说是否进行查找,可能是1个参数,可能是3个参数。我在网络上查询,发现jpa可以对集合进行操作引用
“9.JPA的集合查询:我们知道在SQL语句中,查找某元素是否在某个集合中时常用类似:in(a,b,c)的查询语句,在JDBC中我们常常需要将集合元素拼接成以逗号(“,”)分隔的字符串,在JPA中有两种方法可以方便地进行判断元素是否在集合中的查询:(1).设置集合类型的参数:查询对象的setParameter方法支持Object类型,因此可以传入一个集合类型的参数,如数组或者ArrayList等。例如:Queryquery=em.createQuery(“select*fromUserswherenamein(?names)”);query.setParameter(“name”,names);//names是一个name集合(2).使用memberof关键字:例如:SelecttfromTopictwhere:optionmemberoft.options;”

问题是,如果我传入一个String[]statusArr或者List<String>时,都报出异常。请问jpa里的in查询的到底怎么用?member不能查,直接报unexpecttoken当然,如果实在没办法,我只能去用程序去拼接in的部分了。这是最下策了。

解决方案七:
经测试,可以的啊,楼上的正确。
解决方案八:
在相应字段的get方法里把不要的数据过滤掉。这样做虽然效率低一点,但是不依赖具体的JPA实现。通用性好。
解决方案九:
楼主解决了吗?怎么解决的我也碰到这个问题了?

时间: 2024-07-30 22:39:56

JPA where in查询的问题的相关文章

解析JPA的视图查询问题

        这篇文章主要是对JPA的视图查询问题进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 昨天晚上遇到一个需求,每天早上要生成一份报告给各个部门的Leader.实现方式基本上确定为HTML格式的电子邮件.但是数据方面犯了难.原因在于数据库中存储的数据是跨表的,而且还要做count统计,这样得到的结果就不是原生的MySQL表,我用的又是JPA技术.我们知道,使用JPA第一步就是映射实体,每一张表就至少对应一个实体(力求严谨,因为联合主键时一张表会对应两个对象).可是对

group by-Spring JPA CriteriaQuery分组查询

问题描述 Spring JPA CriteriaQuery分组查询 Spring JPA CriteriaQuery 设置select 查询的字段丝毫没起到作用,很郁闷.网上也有很多类似的问题,都没有解决方法.有没有大神用JPA做过分组查询的?求教... 解决方案 CriteriaQuery q = cb.createQuery(Country.class); Root c = q.from(Country.class); q.select(c.get(""currency"

spring data jpa 多条件查询判读问题

问题描述 spring data jpa 多条件查询判读问题 在使用Spring Data JPA时发现的问题在实际应用中,我们通常会在页面上进行组合查询,例如用户这个对象 页面上会列出用户姓名.年龄.学历.性别.地址.电话等等的一系列查询条件 最近在学习Spring Data JPA,不知这个怎么实现这种组合条件的查询啊 只能手动判断后写SQL吗 解决方案 Spring jpa data多条件分页查询spring data jpa 分页查询 解决方案二: 不用手动写SQL的,SpringJPA

解析JPA的视图查询问题_java

昨天晚上遇到一个需求,每天早上要生成一份报告给各个部门的Leader.实现方式基本上确定为HTML格式的电子邮件.但是数据方面犯了难.原因在于数据库中存储的数据是跨表的,而且还要做count统计,这样得到的结果就不是原生的MySQL表,我用的又是JPA技术.我们知道,使用JPA第一步就是映射实体,每一张表就至少对应一个实体(力求严谨,因为联合主键时一张表会对应两个对象).可是对于灵活的查询尤其是连接查询,并不存在一个真正的表与其对应,怎么样才能解决呢?来,我们来举个"栗子" 假设我们有

JPA连接SQLSERVER查询报错。

问题描述 applicationContext.xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.sp

JPA学习笔记-JPA进阶

1.JPA的实体生命周期: JPA的实体有以下4中生命周期状态: (1).New:瞬时对象,尚未有id,还未和Persistence Context建立关联的对象. (2).Managed:持久化受管对象,有id值,已经和Persistence Context建立了关联的对象. (3).Datached:游离态离线对象,有id值,但没有和Persistence Context建立关联的对象. (4).Removed:删除的对象,有id值,尚且和Persistence Context有关联,但是已

java-jdbc 来查询视图 和 hibernate 查询视图 问题

问题描述 jdbc 来查询视图 和 hibernate 查询视图 问题 伙伴们 现在我在用 jdbc 查询视图 和 hibernate查询视图 都显示不出来数据 (list用来接受数据,调试时的list的size不为0,可数据都是Null 这是怎么回事) 解决方案 JPA的视图查询Hibernate查询视图数据Hibernate createQuery查询视图返回list为空 解决方案二: 如果你给一下查询的代码,或许可以帮你分析一下

实体bean(entity)配置,jpa增删改api,JPAsql增删改

1.ORM框架必然发展趋势: jdbc->hibernate(是产品,实现jpa规范)->jpa(是规范,不是产品). ps:运用jpa规范的API进行编程,不对Hiberbate,topLink等orm框架构成威胁. 2.JPA环境搭建[hibernate-distribution-3.6.10.Final] 1.准备lib包2.jar包引入时,千万注意目录不能有中文或者空格 3.开发步骤: 1.先建表,再编写配置文件和bean-(面向过程,传统的数据库建模思想)2.先编写配置文件和bean

不能用SQL语句-如何用JPA动态查询查询复杂数据

问题描述 如何用JPA动态查询查询复杂数据 我想问的就是怎么用JPA动态查询查询复杂数据 如SELECT IFNULL(sum(i.INVENTORY_AMOUNT)0) FROM INVENTORY i WHERE i.VEN_ID = ?1 and i.ITEM_MYID = ?2 and i.DID is null. 解决方案 http://leobluewing.iteye.com/blog/1969621 解决方案二: 数据查询(3)-复杂查询jpa动态查询杂记JPA中的动态查询与指定