2011-05-05 45 views
12

除了少代碼外,以下兩種使用Hibernate Criteria API構建IN子句的方法有什麼區別?是否有性能問題?我缺少檢索中的邏輯嗎?就行返回而言,它們似乎執行相同。Hibernate Restrictions.in與Disjunction

Disjunction disj = Restrictions.disjunction(); 
for (String value : stringArray) { 
    disj.add(Restrictions.eq("code", value)); 
} 
where.add(disj); 

VS.

Restrictions.in("code", stringArray); 

我問的原因是因爲我重構遺留代碼,前者存在,但我期待後者。如果它們都相同,我將單獨留下遺留代碼。

回答

11

休眠Disjunction用於

 Group expressions together in a single disjunction 

這意味着,如果你有來比較值X或Y或Z 有條件, 您可以遍歷和應用selective disjunction

所以最好你的情況Restrictions.inRestrictions.Disjunction做同樣的事情,我更喜歡前者在這種情況下。

+0

似乎第二種方法更簡潔,不需要循環。雖然你的解釋是有道理的。謝謝。 – sma 2011-05-05 21:01:17

+1

@sma:當我說前者時,我指的是我的帖子中的1st(Restrictions.in),而不是你的帖子:) – Narayan 2011-05-06 05:04:28

5

Restrictions.Disjunction給了我們明確的控制,例如它允許像運算符那樣,而在運算符中則不允許。

例如:

criteria.add(Restrictions.disjunction() 
         .add(Restrictions.eq("bill.stateCd", null)) 
         .add(Restrictions.eq("bill.stateCd", "")) 
         .add(Restrictions.ilike("bill.stateCd","%"+stateCd+"%"))); 

不能與

criteria.add(Restrictions.in("bill.stateCd", Arrays.asList(null,"", "%"+stateCd+"%"))); 
+0

爲什麼反對票!? – Ram 2015-10-14 06:34:39

2

來實現在給定的代碼這兩種行爲時stringArray確實具有零個元素很不同。

對零表達式使用分離可生成與1=1或等效的有效SQL查詢。

Restrictions.in導致沒有值的IN運算符,這通常是(也許某些SQL方言可以處理它)在語法上不正確。