在HQL

2011-09-27 44 views
1

setParameterList可選參數,我有一個可選的參數在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。

謝謝

回答

1

你不能。這會產生無效的SQL。

您需要更改HQL,具體取決於是否有ClinicIds

1

而不是使用HQL,請使用Criteria查詢。它的設計比HQL更具編程性,因爲您可以使用直接的Java代碼來組裝您的查詢,這使您可以使用if-then邏輯。因此,不是要麼連接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(); 
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); 

只是一招