一尘不染

使用条件API在字符串集合中获取具有特定元素的所有对象

hibernate

我正在尝试建立一个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),但它的工作方式却相反(对象中有一个值,许多要匹配的值)。

有任何想法吗?


阅读 256

收藏
2020-06-20

共1个答案

一尘不染

目前,最简单的方法是使用sql限制:

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

或者,您可以编写自己的标准。

2020-06-20