Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用条件API获取字符串集合中具有特定元素的所有对象_Java_Hibernate - Fatal编程技术网

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

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"

我试图构建一个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" 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是可行的。

如果作者是一个实体,则可以使用子查询