2017-09-11 100 views
0

我想使我的小型弹簧项目有效。所以我使用IN子句而不是在hql中使用循环。setParameterList()不返回完整结果集

01)在setParameterList()

问题使用setParameterList(),我们必须通过列表对象

List<Department> listDeptmntId = reportService.listDepartmentID(companyId); //list of objects 

String hql = "select s.department.departmentName, g.dateTime from Gauge g inner join g.survey s where s.department in (:dpts)"; 
Query query = sessionFactory.getCurrentSession().createQuery(hql); 
query.setParameterList("dpts",listDeptmntId); 

查询工作正常。但是这个返回只有一个(第一个对象在listDeptmntId列表中) resultset,不会返回其他结果。

我试图通过整数列表像[1,2,3]使用以下方法也不起作用。

List<Integer> dptIds=listDeptmntId.stream().map((Department::getDepartmentId()).collect(Collectors.toList()); 

02)在setParameter()

int cId=10; 
String hql="...... companyId=:id" 
Query query = sessionFactory.getCurrentSession().createQuery(hql); 
query.setParameter("id",cId); 

问题有时当我使用的参数传递( “=:”),它不为整数工作。不过,直接设置变量来查询像以下工作

int cId=10; 
String hql="...... companyId="+cId 
Query query = sessionFactory.getCurrentSession().createQuery(hql); 

我的代码可能是错误的,因为我要通过电子书和参考材料做项目。先谢谢你。

+0

你是什么意思*有时当我使用参数传递(“=:”)时,它不适用于整数* ? –

+0

,因为它不起作用,我无法弄清楚会发生什么 – varman

+0

这个问题需要: 1.分成两个不同的问题 2.整合代码与一个工作的例子(你使用Query.list()或uniqueResult( )还是其他的?),更好地与休眠配置 –

回答

1

我通常做IN(?, ..., ?)使用java.sql.Array

long[] deptIds = listDeptmntId.toArray(new long[listDeptmntId.size()]; 
java.sql.Array array = conn.createArrayOf("LONG", deptIds); 
query.setPameter("depts", array); 
+0

HQL查询使用(映射)对象而不是java.sql包库(https://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/ Query.html#setParameterList(java.lang.String,java.util。收藏)) –

+0

@LucaBassoRicci当然,谢谢。 –

0

q1)检查连接(看不到任何其他原因只返回一个对象)。并且传递[1,2,3]不会与该查询一起工作,因为在查询中您正在处理部门对象。如果你想让[1,2,3]改变查询来检查这样的dept-id - >“select s.department.departmentName,g.dateTime from Gauge g inner join g.survey s where s.department。 id in(:id-list)“

q2)当您设置参数时,您已经创建了查询对象,因此在该点设置参数可能不会影响查询对象。 (因为在创建查询对象时将参数设置为查询,所以您的“+”方法起作用)。

+0

第一个问题,当我手动给它的工作。例如: '... where(1)中的s.department //返回1的结果集' '...其中s.department在(2)//返回2的结果集' 但是......其中(1,2)中的s.department //仅返回1的结果集 – varman