Можно ли получить псевдоним SQL таблицы соединений для Hibernate sqlRestriction?

У меня есть класс 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_'.

Спасибо за уделенное время!

12
задан Community 23 May 2017 в 12:32
поделиться

3 ответа

Похоже, что Criteria API не позволяет запрашивать коллекции элементов, см. HHH-869 (который все еще открыт) . Так что либо попробуйте предложенный обходной путь - я этого не сделал - либо переключитесь на HQL. Следующий запрос HQL будет работать:

from Person p where :alias in elements(p.aliases)
4
ответ дан 2 December 2019 в 18:53
поделиться

Может эта ссылка вам поможет? Он советует:

List persons = sess.createCriteria(Person.class)
       .createCriteria("company")
       .add(Restrictions.sqlRestriction("companyName || name like (?)",  "%Fritz%", Hibernate.STRING))
       .list(); 
2
ответ дан 2 December 2019 в 18:53
поделиться

Просмотрите эти ошибки Hibernate и используйте прикрепленные файлы:

3
ответ дан 2 December 2019 в 18:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: