Получение всех объектов с определенным элементом внутри коллекции строк с критериями API - PullRequest
8 голосов
/ 27 мая 2010

Я пытаюсь создать запрос Критерии гибернации, чтобы найти сущности, у которых есть определенный элемент внутри коллекции.

Мы можем взять в качестве примера объект 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();

Все это работает хорошо, и я достаю все книги, которые Мэтт писал. Однако в проекте, в котором я работаю, вместо сырого SQL используется API Criteria, и я не нашел способа выразить тот же запрос в этой форме. Я посмотрел на API ограничений и ближе всего нашел Restions.in (propertyName, collection), но он работает наоборот (одно значение в объекте, много значений для сравнения).

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 01 июня 2010

Вы пробовали использовать HQL ?

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

HQL, как правило, более мощный, чем критерии, поэтому вы можете застрять с ним.

2 голосов
/ 07 июня 2010

В настоящее время вы не можете запросить коллекцию типов значений, используя Criteria API. Здесь - это проблема, которая ссылается на сообщения форума, описывающие ту же проблему.

HQL работает, хотя.

2 голосов
/ 27 мая 2010

Простейшим способом было бы использовать ограничение sql, пока:

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

Или вы можете написать свой собственный критерий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...