2015-07-01 52 views
0

我想寫一個排除某些實體的hibernate標準。這是我到目前爲止:如何編寫一個標準來排除某些實體

Criterion exclusion1 = Restrictions.not(Restrictions.conjunction() 
    .add(Restrictions.eq("color", "blue"); 
    .add(Restrictions.eq("type", "aaa")) 
    .add(Restrictions.eq("subtype1", "bbb")) 
    .add(Restrictions.eq("subtype2", "ccc")); 

Criteria crit = session.createCriteria(MyObject.class); 
crit.add(exclusion1); 

List result = crit.list(); 

有幾個這樣的排除標準。這似乎是做我想要的,除非如果任何字段爲空,我希望它被包括在內。例如,具有color = blue,type = aaa,subtype1和subtype2的實體被包括在內。

我該如何重寫這個到而不是排除那個實體?

+0

具有null子類型1的實體不受限制'eq(「subtype1」,「bbb」)'的匹配,所以它也沒有被連接符映射,因此包含它。你不需要改變你的代碼。 –

+0

是的,這就是我的想法。但是它仍然沒有做我想做的事。我希望有人能夠找出正確的方式去做我想做的事。 –

回答

0

以下是我想要的方式。

this answer看來,正確的做法是使用子查詢來定義應該排除的內容。例如

Criterion exclusion1 = Restrictions.conjunction() 
    .add(Restrictions.eq("color", "blue")) 
    .add(Restrictions.eq("type", "aaa")) 
    .add(Restrictions.eq("subtype1", "bbb")) 
    .add(Restrictions.eq("subtype2", "ccc")); 

Criterion exclusion2 = Restrictions.conjunction() 
    .add(Restrictions.eq("color", "blue")) 
    .add(Restrictions.eq("type", "ddd")) 
    .add(Restrictions.eq("subtype1", "eee")); 

DetachedCriteria excludes = DetachedCriteria.forClass(MyObject.class) 
    .add(Restrictions.disjunction() 
     .add(exclusion1) 
     .add(exclusion2)) 
    .setProjection(Projections.property("id")); 

Criteria crit = session.createCriteria(MyObject.class); 
crit.add(Restrictions.eq("state","ok")); 
crit.add(Property.forName("id").notIn(excludes)); 

List results = crit.list(); 

我仍然有興趣知道是否有更好的方法,但這似乎很不錯。