如何在hql查询中传递列表,其中list是map的值

时间:2016-06-27 04:37:23

标签: java spring hibernate

我有一个包含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查询中传递列表?

2 个答案:

答案 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