2010-05-27 32 views
8

我試圖構建Hibernate條件查詢來查找具有集合中特定元素的實體。使用條件獲取具有特定元素的字符串集合中的所有對象API

我們可以以一個例子一本書-object,看起來像這樣:

public class Book { 
    private Long id; 
    private String title; 
    private Set<String> authors = new HashSet<String>(); 
} 

實體映射這樣的:

<class name="Book" table="Book"> 
    <id name="id" column="BOOK_ID"> 
     <generator class="native"/> 
    </id> 
    <property name="title"/> 
    <set name="authors" table="Book_Authors"> 
     <key column="BOOK_ID"/> 
     <element type="string" column="AUTHORS"/> 
    </set> 
</class> 

現在我想找出哪些書馬特寫的。用純SQL我可以做一個這樣的查詢:

String author = "Matt"; 
String query = "SELECT * FROM Book " + 
       "WHERE BOOK_ID IN " + 
       "(SELECT BOOK_ID FROM Book_Authors " + 
       "WHERE authors = :author)"; 
List<Book> result = session.createSQLQuery(query) 
     .addEntity(Book.class) 
     .setParameter("author", author) 
     .list(); 

這工作都好和好,和我出去馬特一直是書寫文字的一部分的所有書籍。然而,我工作的項目使用Criteria API而不是原始SQL,並且我還沒有找到以這種形式表達相同查詢的方法。我查看了限制API,並且找到最接近的是Restions.in(propertyName,collection),但是其他方式(對象中有一個值,許多值匹配)。

任何想法?

+0

如果作者是一個實體,你可以使用子查詢 – sblundy 2010-06-01 18:25:03

回答

2

最簡單的方法是使用一個SQL限制,現在:

criteria.add(Restrictions.sqlRestriction("BOOK_ID IN " + 
       "(SELECT BOOK_ID FROM Book_Authors " + 
       "WHERE authors = " + author + ")")); 

或者你也可以寫自己的標準。

4

您是否嘗試過使用HQL

SELECT bk FROM Book bk WHERE :author IN bk.authors 

HQL通常比Criteria更強大,因此您可能會被卡住。

+0

我同意你的意見。 – Alex 2013-08-02 17:30:59

2

您目前無法使用Criteria API查詢值類型的集合。 Here是問題,它鏈接到描述相同問題的論壇帖子。

HQL的工作,雖然。

+0

謝謝指出票。 – 2010-06-07 14:14:06

相關問題