我正在尝试构建一个Hibernate Criteria查询来查找在集合中具有特定元素的实体.
我们可以举一个看起来像这样的Book -object:
public class Book {
private Long id;
private String title;
private Set<String> authors = new HashSet<String>();
}
Run Code Online (Sandbox Code Playgroud)
实体映射如下:
<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>
Run Code Online (Sandbox Code Playgroud)
现在我想找出Matt写的是哪些书.使用纯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();
Run Code Online (Sandbox Code Playgroud)
这一切都很好,而且我得到了Matt参与写作的所有书籍.但是,我工作的项目使用Criteria API而不是原始SQL,我还没有找到一种方法来表达该表单中的相同查询.我已经看了Restrictions API,我发现最接近的是Restions.in(propertyName,collection),但是反过来(对象中的一个值,要匹配的许多值).
有任何想法吗?
小智 2
目前最简单的方法是使用 sql 限制:
criteria.add(Restrictions.sqlRestriction("BOOK_ID IN " +
"(SELECT BOOK_ID FROM Book_Authors " +
"WHERE authors = " + author + " )"));
Run Code Online (Sandbox Code Playgroud)
或者您可以编写自己的标准。
| 归档时间: |
|
| 查看次数: |
2961 次 |
| 最近记录: |