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).

Но мога ли да: Прехвърлям резултата си към отделен клас или B да назова полетата си в моята createquery така, че да бъдат именувани при връщане на моя JSON?

Например в .Net Land мога да направя нещо като....

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

и след това прехвърлете това към друг тип. Опитах се да използвам typedquery и кастинг, но получавам грешка от типа „Тип 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