У меня есть класс 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 |
--------------------------------
Я хочу сделать запрос Критерии гибернации для всех людей, которые используют псевдоним "Супермен".
По причинам, слишком длинным для перечисления здесь, я действительно хотел бы сделать это запросом Criteria, а не HQL-запросом (если только невозможно добавить ограничение HQL для объекта Criteria, в этом случае я весь слух) или сырой запрос SQL. Поскольку в соответствии с Как запросить объекты со значением в коллекции String с использованием Hibernate Criteria? невозможно ссылаться на элементы коллекций типа значения с помощью 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? Если нет подходящего токена подстановки, такого как {псевдоним}, то есть ли способ перевести меня в спящий режим, чтобы сказать мне, каким будет этот псевдоним? Я заметил метод с именем generateAlias () org.hibernate.util.StringHelper class. Поможет ли это мне предсказать, каким будет псевдоним?
Я бы очень, очень хотел бы избежать жесткого кодирования 'aliases2_'.
Спасибо за ваше время!