JPA EntityManager TypedQuery - 返回与实体模型不同的类(ViewModel/DTO)?

Yab*_*rgo 2 jpa entitymanager

来自实体框架背景我可以将我的ORM结果转换为包含完整后端模型数据子集的类.

我有一个JAX-RS REST服务,我通常会返回类似的东西

MyEntity result = em.createQuery(select e from MyEntity e ... blah blah blah).
Run Code Online (Sandbox Code Playgroud)

我知道我可以这样做:

Object result = em.createQuery(select e.Title, e.Version, e.Date from MyEntity e... blah blah blah).
Run Code Online (Sandbox Code Playgroud)

但是,我可以:将我的结果转换为单独的类,或者在我的createquery中命名我的字段,以便在返回我的JSON时命名它们吗?

例如在.Net Land我可以做类似......

(select new {Title = e.Title, Version = e.Version}) 
Run Code Online (Sandbox Code Playgroud)

然后将其转换为另一种类型.我尝试使用typedquery和cast但是我得到了"Type X与返回类型Y不兼容"类型错误.

我的目标是返回我的信息的特定子集(视图模型/ DTO),以便在特定场景中使用.

例如,我的模型非常庞大,我不希望每次都返回大量数据.

kos*_*tja 8

是的,使用JPA构造函数表达式(即NEW关键字)可以创建非实体类型 :

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

DTO必须具有包含所有相关字段的构造函数.

不需要铸造.