Я пытаюсь создать запрос Критерии гибернации, чтобы найти сущности, у которых есть определенный элемент внутри коллекции.
Мы можем взять в качестве примера объект 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), но он работает наоборот (одно значение в объекте, много значений для сравнения).
Есть идеи?