У меня есть класс Person, у которого есть String-коллекция псевдонимов, представляющих дополнительные имена, которые может пройти человек. Например, у Кларка Кента могут быть псевдонимы "Супермен" и "Человек из стали". Дуайт Говард также имеет псевдоним "Супермена".
@Entity
class Person {
@CollectionOfElements(fetch=FetchType.EAGER)
Set<String> aliases = new TreeSet<String>();
Hibernate создает две таблицы в моей базе данных Person и Person_aliases. Person_aliases - это таблица соединений с столбцами Person_id и element. Пусть say 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? Если нет подходящего токена подстановки, такого как {alias}, то есть ли способ заставить спящий режим сказать мне, что это за псевдоним? Я заметил метод, называемый классом generateAlias () org.hibernate.util.StringHelper. Помогло бы мне предсказать, что такое псевдоним?
Я действительно хотел бы, чтобы избежать жесткого кодирования "aliases2_".
Спасибо за ваше время!