2009-08-14 112 views
4

我想使用Hibernate的Criteria API來精確描述每個人所說的可能是其最可能的用例,應用複雜的搜索條件。問題是,我想查詢的表不是完全由原始值組成,而是部分來自其他對象,我需要查詢這些對象的ID。Hibernate的Criteria API是否仍然不支持嵌套關係

我從2年前發現this article,表明這是不可能的。下面是我如何嘗試它無濟於事,還有其他方面的Hibernate,我知道這種點符號在字符串文本中被支持以指示對象嵌套。

if (!lookupBean.getCompanyInput().equals("")) { 
     criteria.add(Restrictions.like("company.company", lookupBean.getCompanyInput() + "%")); 
    } 

編輯:

這是我爲實現我試圖上面,使用從下面的第一個答案的建議正確分解代碼;注意,我甚至使用附加個createCriteria來電訂購一個屬性在另一個相關聯的對象/表:

if (!lookupBean.getCompanyValue().equals("")) { 
    criteria.createCriteria("company").add(
      Restrictions.like("company", lookupBean.getCompanyValue() + "%")); 
} 

List<TrailerDetail> tdList = 
     criteria.createCriteria("location").addOrder(Order.asc("location")).list(); 

回答

7

不能完全確定我按照你的榜樣,但它肯定可以對相關的實體指定過濾條件,只需通過嵌套條件對象來形成一棵樹。舉例來說,如果我有一個名爲訂購有許多對一個關係到用戶實體的實體,我能找到的所有訂單名爲弗雷德用這樣的查詢用戶:

List<Order> orders = session.createCriteria(Order.class) 
    .createCriteria("user") 
     .add(eq("name", "fred")) 
    .list(); 

如果你正在談論一個與自己有關係的實體,那也應該是一樣的。如果您需要過濾關聯對象的ID,您也可以用「id」替換「name」。

+2

+1。儘管如此,您想要注意ID,具體取決於映射,可能不需要(甚至不合法)創建嵌套標準以通過ID查詢關聯。因此,在上面的例子中,你可以使用'session.createCriteria(Order.class).add(eq(「user.id」,25))。list()' – ChssPly76 2009-08-14 19:18:24

+0

我要補充的是,如果你有一個引用到Java代碼中的關聯對象,您也可以將實體對象本身作爲參數傳遞給Restrictions.eq調用(例如Restrictions.eq(「user」,user))而不是ID。使用Session.load(User.class,)可以輕鬆獲得此類引用,而無需支付性能損失。 – 2009-08-14 19:28:14

+0

感謝您的建議。沒有對相關對象的引用。我可能會編輯我的問題以指示可以使用的替換代碼。但是如果你需要的話,你會如何嵌套多個Criteria?我不需要,但那可能是有問題的。如果你只需要嵌套一個,雖然它可能是你最後的東西你堅持原來的標準。 無論如何,謝謝!我剛剛用一個StringBuffer替換了幾十行構建HQL查詢的代碼,大約少於10行。 – 2009-08-14 19:35:08