我有一个包含4个假名的leaveList。这个leaveList作为map值传递。我想通过在hql查询中传递leaveList来从CompanyLeave表中获取详细信息。让我们考虑一下,我的公司离开表包含6个详细信息.leaveList有3个假名。我想从CompanyLeave Table获得这3片叶子的详细信息。
这里的Hql查询代码leaveNameList是一个列表以及map
public List<CompanyLeaveType> getByValidLeave(Map<String, Object> params) {
Query query = sessionfactory.getCurrentSession().createQuery("from CompanyLeaveType WHERE companyCode = :companyCode and leaveName IN (:leaveNames)");
query.setParameter("companyCode", params.get("companyCode"));
query.setParameter("leaveNames", params.get("leaveNameList"));
List<CompanyLeaveType> validLeaveDetails = query.list();
return validLeaveDetails;
}
N.B:我有java.util.ArrayList无法转换为java.lang.String错误。如何在hql查询中传递列表?
答案 0 :(得分:1)
Query query = sessionfactory.getCurrentSession().createQuery("from CompanyLeaveType WHERE companyCode = :companyCode and leaveName IN (:leaveNames)");
query.setParameter("leaveNames", params.get("leaveNameList"));
在这里,您尝试将列表对象添加到Hql查询中。 在这种情况下,hibernate生成的查询看起来像这样(实际上它没有发生,只是为了让你理解这里发生的事情)
1) Select *from companyLeveType_Table where companyCode=someX and leaveName in(ListObject)
但是这里的leaveName是java.lang.String类型,因此hibernte框架期望值应该只是字符串。请参阅示例代码(Hibernte期望这样)
2) Select *from companyLeveType_Table where companyCode=someX and leaveName in("A","B","C");
从第一次查询看来,很明显hibernate框架试图将java.util.ArrayList转换为java.lang.String,从而抛出异常。
解决方案1)
public List<CompanyLeaveType> getByValidLeave(Map<String, Object> params) {
Query query = sessionfactory.getCurrentSession().createQuery("from CompanyLeaveType WHERE companyCode = :companyCode and leaveName IN (:leaveNames)");
query.setParameter("companyCode", params.get("companyCode"));
query.setParameterList("leaveNames", params.get("leaveNameList")); // changes here only remaining is same
List<CompanyLeaveType> validLeaveDetails = query.list();
return validLeaveDetails;
}
解决方案2: 使用Criteria api。
public List<CompanyLeaveType> getByValidLeave(Map<String, Object> params) {
Criteria criteria=session.createCriteria(CompanyLeaveType.class);
criteria.addCriteria(Restrictions.eq("companyCode",params.get("companyCode")))
.addCriteria(Restrictions.in("leaveName",params.get("leaveNameList")));
List<CompanyLeaveType> validLeaveDetails =criteria.list();
return validLeaveDetails;
}
我希望这有助于你
答案 1 :(得分:0)
使用query.setParameterList(),在此检查documentation。