JPA 2.0: загрузить подмножество полей для объекта - PullRequest
8 голосов
/ 29 июня 2011

У меня есть объект с именем address. Адрес Entity имеет несколько полей, одним из которых является CITY. Я создал запрос, вызвав entityManager.createQuery, но мой запрос включает только поле CITY в предложении select (потому что я только хочу загрузить это поле). Поле CITY имеет тип String. Когда я получаю свой resultList, я получаю не список объектов Address, а список Object [].

Есть ли способ создать список адресов вместо списка объектов []? Мой провайдер JPA находится в режиме гибернации, последняя версия. Я хочу решение, которое не требует использования чего-либо конкретного Hibernate.

Ответы [ 2 ]

14 голосов
/ 30 июня 2011

Это возможно с помощью выражений конструктора в вашем запросе. Обычно вы используете это с пользовательским DTO, но оно должно работать и с сущностью. Сначала создайте дополнительный конструктор в вашей сущности, взяв только необходимые поля:

public Address() {
    //default constructor
}

public Address(String city) {
    this.city = city;
}

Ваш запрос может выглядеть следующим образом:

select new your.package.Address(a.city) from Address a where ...

Обратите внимание, что полученный объект не присоединен к EntityManager, поэтому изменения в нем не будут автоматически сохраняться.

2 голосов
/ 29 июня 2011

Как Hibernate будет загружать экземпляры Address, если вы запрашиваете города? Объекты JPA являются объектами, и объекты должны уважать инварианты. Например, одним из таких инвариантов может быть то, что адрес всегда имеет идентификатор, улицу и т. Д. Если Hibernate загружает частичные объекты (с заполненным только атрибутом city), эти инварианты будут нарушены, и вы больше не сможете полагаться на свой собственный код , У вас также могут возникнуть всевозможные проблемы, если вы попытаетесь присоединить такой Адрес к другому объекту или просто попытаетесь удалить его, потому что у него больше не будет идентификатора.

Итак, короткий ответ - нет: это невозможно.

Длинный ответ заключается в том, что поскольку Adress является POJO, вам просто нужно создать адреса из загруженных городов самостоятельно или с помощью ResultTransformer. Но вы получите временные экземпляры Address, а не присоединенные объекты Adress. Это рецепт для бесчисленных ошибок и путаницы, ИМХО.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...