我想有效地完成我的小弹簧项目。所以我使用IN
子句而不是在hql中使用循环。
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
列表中的第一个对象)结果集,不会返回其他结果。
我尝试使用以下方法传递像 [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 :(得分: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);
答案 1 :(得分:0)
q1)检查连接(无法查看仅返回一个对象的任何其他原因)。并且传递[1,2,3]不会使用该查询,因为在查询中您处理部门对象。如果你想[1,2,3]工作,改变查询以检查这样的dept-id - &gt; &#34;从Gauge g inner join g.survey中选择s.department.departmentName,g.dateTime,其中s.department.id在(:id-list)&#34;
q2)您在设置参数时已经创建了查询对象,因此在该点设置参数可能不会影响查询对象。 (您的&#34; +&#34;方法有效,因为在创建查询对象时将参数设置为查询。)