HQL中setParameterList的可选参数

时间:2011-09-27 20:26:08

标签: nhibernate hql

我有一个带可选参数

的查询
"SELECT ClinicId,Name from Clinic where :ClinicIds is NULL OR ClinicId IN :ClinicIds"

List<int> ClinicIds = null;

我正在传递参数,如下所示

q.SetParameterList("ClinicIds", ClinicIds);

因为ClinicId是可选参数。如果我将null传递给SetParameterList,我会遇到异常。知道如何将可选参数(空值)传递给SetParameterList。

由于

3 个答案:

答案 0 :(得分:3)

使用Criteria查询,而不是使用HQL。它的设计比HQL更具编程性,因为您使用直接的Java代码来汇编查询,这使您可以使用if-then逻辑。因此,您需要一个Criteria查询来解决这两种情况,而不是连接HQL,或者您需要独立维护两个不同的HQL查询。例如:

//SELECT ClinicId,Name from Clinic where :ClinicIds is NULL OR ClinicId IN :ClinicIds
Criteria criteria = getSession().createCriteria(Clinic.class);
if(ClinicIds == null) {
    criteria.add(Restrictions.eq("ClinicId", null));
} else {
    criteria.add(Restrictions.or(
            Restrictions.eq("ClinicId", null), 
            criteria.add(Restrictions.in("ClinicId", ClinicIds));
        )
    );
}
return criteria.list();

答案 1 :(得分:1)

你做不到。这将生成无效的SQL。

您需要根据是否ClinicIds来更改HQL。

答案 2 :(得分:0)

我这样做了:

"SELECT ClinicId,Name from Clinic where -1 in (:ClinicIds)  OR ClinicId IN :ClinicIds"

if(ClinicIds == null or ClinicIds.isEmpty()){
    ClinicIds = new List<int>();
    ClinicIds.add(-1);
}

q.SetParameterList("ClinicIds", ClinicIds);

只是一招(