Java 使用条件API获取字符串集合中具有特定元素的所有对象
我试图构建一个Hibernate条件查询,以查找集合中具有特定元素的实体 我们可以举一个图书对象为例,如下所示:Java 使用条件API获取字符串集合中具有特定元素的所有对象,java,hibernate,Java,Hibernate,我试图构建一个Hibernate条件查询,以查找集合中具有特定元素的实体 我们可以举一个图书对象为例,如下所示: public class Book { private Long id; private String title; private Set<String> authors = new HashSet<String>(); } <class name="Book" table="Book"> <id name="id"
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>
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();
实体映射如下所示:
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>
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();
现在我想知道哪些书是马特写的。使用纯SQL,我可以执行如下查询:
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>
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();
这一切都很好,我把马特写过的书都拿出来了。然而,我工作的项目使用CriteriaAPI而不是原始SQL,我还没有找到一种方法以这种形式表达相同的查询。我看了一下Restrictions API,找到的最接近的是Restions.inpropertyName,collection,但它以另一种方式围绕对象中的一个值工作,即许多要匹配的值
有什么想法吗?目前最简单的方法是使用sql限制:
criteria.add(Restrictions.sqlRestriction("BOOK_ID IN " +
"(SELECT BOOK_ID FROM Book_Authors " +
"WHERE authors = " + author + " )"));
或者您可以编写自己的标准。您尝试过使用吗
HQL通常比Criteria更强大,因此您可能会被它卡住。您当前无法使用Criteria API查询值类型集合。就是这个问题,它链接到描述相同问题的论坛帖子
不过,HQL是可行的。如果作者是一个实体,则可以使用子查询