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

标签 java hibernate

我正在尝试构建一个 Hibernate Criteria 查询来查找集合中具有特定元素的实体。

我们可以以一个 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) 但它的工作方式相反(对象中的一个值,要匹配的许多值)。

有什么想法吗?

最佳答案

您是否尝试过使用 HQL

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

HQL 通常比 Criteria 更强大,因此您可能会受困于它。

关于java - 使用条件 API 获取字符串集合中具有特定元素的所有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2920678/

相关文章:

java - 如何在鼠标单击 JTextField 时清除 JTextField

java - 在 Windows 上读取文件但在 Linux 容器上不读取?

java - 如何将 google 文档与我的 java web 应用程序集成?

java - 已签名的 Java Applet/Web Start 能否操纵跨站点 IFRAME 中的内容?

java - 如何将包含单引号的字符串保存到 PostgreSQL 中的文本列

java - Hibernate - 回滚 : org. hibernate.MappingException:未知实体

java - NetBeans 错误显示在书籍 "Pro JavaFX 8: A Definitive Guide"初始化 FXML 文件中的对象中的示例代码中

java - saveorupdate()在hibernate中不更新集合(list)一对多映射

java - 为什么我只能在实体类上放置 NamedQuery 注释

java - Hibernate:如何将此标准重写为 HQL?