2015-12-14 45 views
0
Criteria criteria = session.createCriteria(TableA.class) 
     .add(Subqueries.propertyNotIn("id_a", DetachedCriteria.forClass(TableB.class) 
     .createAlias("id_a_from_tableB", "b") 
     setProjection(Property.forName("b.id_a")))); 

我用它來獲取ID_A表A如果ID_A表B。我還需要id_a如果在表B但字段「消息」不爲空。Java的休眠Restcrition標準或與DetachedCritera

+0

什麼已經工作,什麼不是? –

+0

這就是我寫的作品(如果id_a不在TableB中,則從TableA獲得id_a)。我不知道如何添加另一個標準來檢查TableB中的id_a_from_tableB是否與TableA中的id_a相等,字段「message」不爲null。 –

回答

0

我覺得這篇文章可以help you

與標準,我認爲Hibernate不支持UNION ALL但你 可以使用兩個標準的查詢,以獲得預期的結果:

Criteria cr1 = session.createCriteria(Suppliers.class); 
cr1.setProjection(Projections.projectionList() 
    .add(Projections.property("supplier_id"), "supplier_id") 
); 
List results1 = cr1.list(); 

Criteria cr2 = session.createCriteria(Orders.class); 
cr2.setProjection(Projections.projectionList() 
    .add(Projections.property("supplier_id"), "supplier_id") 
); 
List results2 = cr2.list(); 

results1.add(results2); 

List unionAllList = results1; //this is the expected result. 

例如,當你從讓你可以添加新的標準TableB如果消息不爲null,並且稍後僅加入兩個Java集合:

Criteria criteria1 = session.createCriteria(TableB.class) 
.add(Restrictions.isNotNull("message") 

P.S.或者我推薦使用JPA2.1(第6章)中的Criteria API而不是hibernate Criteria,因爲它看起來像簡單的SQL,而且這個解決方案更普遍。

+0

我不知道如何將其應用於我的代碼中。 –

+0

我在帖子中添加了示例 –