我正在尝试建立一个hibernate条件查询,以查找在集合中具有特定元素的实体。
我们可以以如下所示的Book对象为例:
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,而且我还没有找到一种以这种形式表示相同查询的方法。我看了一下Restrictions API,发现的最接近的是Restions.in(propertyName,collection),但它的工作方式却相反(对象中有一个值,许多要匹配的值)。
有任何想法吗?
目前,最简单的方法是使用sql限制:
criteria.add(Restrictions.sqlRestriction("BOOK_ID IN " + "(SELECT BOOK_ID FROM Book_Authors " + "WHERE authors = " + author + " )"));
或者,您可以编写自己的标准。