JPA EntityManager TypedQuery возвращает класс, отличный от модели объекта (ViewModel/DTO)?

Исходя из фона Entity Framework, я могу привести свои результаты ORM к классу, который содержит подмножество данных полной внутренней модели.

У меня есть служба JAX-RS REST, где я обычно возвращаю что-то вроде

MyEntity result = em.createQuery(select e from MyEntity e ... blah blah blah).

Я знаю, что могу это сделать:

Object result = em.createQuery(select e.Title, e.Version, e.Date from MyEntity e... blah blah blah).

Но могу ли я либо: перевести свой результат в отдельный класс, либо назвать свои поля в моем запросе на создание таким образом, чтобы они были названы при возврате моего JSON?

Например, в .Net Land я мог бы сделать что-то вроде....

(select new {Title = e.Title, Version = e.Version}) 

а затем привести это к другому типу. Я пытался использовать типизированный запрос и кастинг, но получаю ошибку типа «Тип X несовместим с возвращаемым типом Y».

Моя цель — вернуть определенное подмножество (модель просмотра/DTO) моей информации для использования в конкретном сценарии.

Например, моя модель огромна, и я не хочу каждый раз возвращать большой объем данных.


person Yablargo    schedule 13.02.2013    source источник


Ответы (1)


Да, создание типов, не являющихся объектами, возможно с использованием выражений конструктора JPA, т.е. ключевого слова NEW:

List<DTO> dtos = em.createQuery("SELECT NEW com.example.DTO( o.title, o.version) FROM Entity o").getResultList();

DTO должен иметь конструктор со всеми соответствующими полями.

Нет необходимости в литье.

person kostja    schedule 13.02.2013