API критериев Hibernate по-прежнему не поддерживает вложенные отношения

StackOverflow https://stackoverflow.com/questions/1279500

Вопрос

Я бы хотел использовать API критериев Hibernate именно для того, что, по всеобщему мнению, является наиболее вероятным вариантом его использования, применяя сложные критерии поиска.Проблема в том, что таблица, к которой я хочу выполнить запрос, состоит не полностью из примитивных значений, а частично из других объектов, и мне нужно выполнить запрос по идентификаторам этих объектов.

Я нашел эта статья начиная с 2-летней давности, это говорит о том, что это невозможно.Вот как я пробовал это безрезультатно, есть другой аспект Гибернации, где я знаю, где этот вид точечной записи поддерживается в строковых литералах для обозначения вложенности объекта.

   if (!lookupBean.getCompanyInput().equals("")) {
       criteria.add(Restrictions.like("company.company", lookupBean.getCompanyInput() + "%"));
   }

Редактировать:

Вот мой правильно составленный код для выполнения того, что я пытался сделать выше, используя предложение из первого ответа ниже;обратите внимание, что я даже использую дополнительный вызов createCriteria для упорядочивания атрибута в еще одном связанном объекте / таблице:

if (!lookupBean.getCompanyValue().equals("")) {
    criteria.createCriteria("company").add(
           Restrictions.like("company", lookupBean.getCompanyValue() + "%"));
}

List<TrailerDetail> tdList = 
        criteria.createCriteria("location").addOrder(Order.asc("location")).list();
Это было полезно?

Решение

Не совсем уверен, что следую вашему примеру, но, безусловно, можно указать условия фильтрации для связанного объекта, просто вложив Критерии объекты для формирования дерева.Например, если у меня есть объект, называемый Порядок с отношением "многие к одному" к Пользователь сущность, я могу найти все заказы для пользователя по имени Фред с помощью такого запроса:

List<Order> orders = session.createCriteria(Order.class)
    .createCriteria("user")
        .add(eq("name", "fred"))
    .list();

Если вы говорите о сущности, которая имеет отношение к самой себе, это тоже должно сработать.Вы также можете заменить "имя" на "идентификатор", если вам нужно выполнить фильтрацию по идентификатору связанного объекта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top