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();
+1。儘管如此,您想要注意ID,具體取決於映射,可能不需要(甚至不合法)創建嵌套標準以通過ID查詢關聯。因此,在上面的例子中,你可以使用'session.createCriteria(Order.class).add(eq(「user.id」,25))。list()' – ChssPly76 2009-08-14 19:18:24
我要補充的是,如果你有一個引用到Java代碼中的關聯對象,您也可以將實體對象本身作爲參數傳遞給Restrictions.eq調用(例如Restrictions.eq(「user」,user))而不是ID。使用Session.load(User.class,)可以輕鬆獲得此類引用,而無需支付性能損失。 –
2009-08-14 19:28:14
感謝您的建議。沒有對相關對象的引用。我可能會編輯我的問題以指示可以使用的替換代碼。但是如果你需要的話,你會如何嵌套多個Criteria?我不需要,但那可能是有問題的。如果你只需要嵌套一個,雖然它可能是你最後的東西你堅持原來的標準。 無論如何,謝謝!我剛剛用一個StringBuffer替換了幾十行構建HQL查詢的代碼,大約少於10行。 – 2009-08-14 19:35:08