У меня есть класс Person, в котором есть коллекция псевдонимов String, представляющих дополнительные имена, которые может использовать человек. Например, Кларк Кент может иметь псевдонимы «Супермен» и «Человек из стали». У Дуайта Ховарда также есть псевдоним «Супермен».
@Entity
class Person {
@CollectionOfElements(fetch=FetchType.EAGER)
Set<String> aliases = new TreeSet<String>();
Hibernate создает две таблицы в моей базе данных: Person и Person_aliases. Person_aliases - это объединенная таблица со столбцами Person_id и element. Допустим, у Person_aliases есть следующие данные
--------------------------------
| Person_id | element |
--------------------------------
| Clark Kent | Superman |
| Clark Kent | Man of Steel |
| Dwight Howard | Superman |
| Bruce Wayne | Batman |
--------------------------------
. Я хочу сделать запрос критериев гибернации для всех людей, которые используют псевдоним «Супермен».
По причинам, слишком длинным, чтобы перечислять здесь, я бы действительно хотел сделать это запросом критериев, а не запросом HQL (если только невозможно добавить ограничение HQL для объекта критериев, и в этом случае я все слышу) или необработанный SQL-запрос. Поскольку в соответствии с Как мне запросить объекты со значением в коллекции String с использованием критериев Hibernate? невозможно ссылаться на элементы коллекций типов значений с помощью CriteriaAPI, я решил прибегнуть к добавлению SqlRestriction для моего объекта критериев.
Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.sqlRestriction("XXXXX.element='superman'");
в надежде, что Hibernate создаст оператор SQL, подобный
select *
from
Person this_
left outer join
Person_aliases aliases2_
on this_.id=aliases2_.Person_id
where
XXXXX.element='superman'
. Однако мне нужно заполнить XXXXX псевдонимом таблицы для таблицы Person_aliases в запросе SQL, который в данном случае будет 'aliases2_'.Я заметил, что если мне нужна ссылка на псевдоним таблицы Person, я могу использовать {alias}. Но это не сработает, потому что основная таблица для этого критерия - Person, а не Person_aliases.
Что мне заполнять для XXXXX? Если нет подходящего токена подстановки, такого как {alias}, то есть ли способ перейти в спящий режим, чтобы сообщить мне, каким будет этот псевдоним? Я заметил метод под названием generateAlias () org.hibernate.util.StringHelper class. Поможет ли это предсказать, каким будет псевдоним?
Я бы очень, очень хотел избежать жесткого кодирования 'aliases2_'.
Спасибо за уделенное время!
Похоже, что Criteria API не позволяет запрашивать коллекции элементов, см. HHH-869 (который все еще открыт) . Так что либо попробуйте предложенный обходной путь - я этого не сделал - либо переключитесь на HQL. Следующий запрос HQL будет работать:
from Person p where :alias in elements(p.aliases)
Может эта ссылка вам поможет? Он советует:
List persons = sess.createCriteria(Person.class)
.createCriteria("company")
.add(Restrictions.sqlRestriction("companyName || name like (?)", "%Fritz%", Hibernate.STRING))
.list();
Просмотрите эти ошибки Hibernate и используйте прикрепленные файлы: