Hibernate: как искать объекты в наборе - PullRequest
0 голосов
/ 25 июля 2011

Я пытаюсь выяснить, как лучше всего написать оператор HQL для следующего сценария:

У меня есть класс Book, одно из его свойств имеет тип Set {Author} (на самом делепредназначен для ввода знаков неравенства здесь).Класс Author имеет такие свойства, как идентификатор, имя и т. Д.

Теперь мой метод DAO получает в качестве параметра «Установить авторы ».Для этого метода я хочу написать HQL-запрос, чтобы я мог получить все Книги, в которых хотя бы один из их авторов найден у авторов .

Каков наилучший способ сделать это?

Обратите внимание, что как свойство Set в классе Book, так и параметр Set, передаваемый методу, могут включать несколько авторов.

Спасибо!

РЕДАКТИРОВАТЬ

Если бы у меня был только один автор на одну Книгу, я мог бы сделать что-то вроде:

FROM Book as book WHERE book.author IN (:authors)

Однако это не работает, когда у каждой Книги есть Набор Авторов.

Ответы [ 3 ]

1 голос
/ 25 июля 2011

Вы пробовали

select distinct b from Book b join b.authors a where a in (:authors)

Обратите внимание, что если вам нужно join fetch, оно должно быть указано отдельно:

select distinct b from Book b join b.authors a left join fetch b.authors 
where a in (:authors)
0 голосов
/ 25 июля 2011

Есть ли конкретная причина, по которой вы не хотите использовать Критерии Hibernate для этого?

Set<Author> authors = [ your set of Author Objects ]
Criteria crit = createCriteria(Book.class)
                .add( Restrictions.in( "author", authors ) );

List<Book> books = crit.list();
0 голосов
/ 25 июля 2011

Вы должны сделать один запрос hql по автору, переданный в качестве параметра.

Для каждого автора HQL будет выглядеть так:

from Book as book 
join book.authors author 
where author = < one_of_my_author_passed_as_parameter >

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

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