JPQL查询可以使用NEW
运算符返回自定义结果对象:
SELECT NEW myPackage.MyVO(e.fieldX, e.relationshipX.fieldY)
FROM MyEntity AS e
这对于提供VO非常有用。问题是,您必须创建与查询投影的参数,顺序和类型的数量完全匹配的构造函数。当您对同一个VO使用大量投影时,这开始变得混乱......要么您的VO中有一个大的构造函数,并且在查询中使用了大量NULL
个文字,或者您的VO必须有一个很多不同的建设者。
所以我的问题是:JPQL中是否有办法通过mutators而不是构造函数设置结果对象字段?
对于具有.NET背景的人,我期待相当于LINQ + object initializers。
答案 0 :(得分:1)
简短回答否你不能在JPQL中使用mutators。
虽然我不知道LINQ
但我没有看到这样做而不会造成混乱。
现在我确信你知道Classes可以有多个构造函数。那么为什么不创建一些你不会在null
中输入的构造函数。
根据您的需要和您正在使用的JPA实施,大多数提供商都会提供非标准的方法。例如。 Hibernate有@formula
,在某些情况下使用它来代替使用构造函数。
我使用JPA2然后标准查询可能是更好的选择,可以处理这些事情。
在某些情况下,您可能更喜欢使用@PostLoad
。
无论哪种方式,您都需要知道SQL中没有发生这种转换,因此您实际上并没有将任何工作卸载到SQL。我们通常更喜欢,即使SQL在单击中尽可能多地工作。
是的,这些是我的概括,具体的解决方案或要求可能不适合。
答案 1 :(得分:1)
DataNucleus JPA当然支持两种使用非标准注释或调用实例化结果对象的方法,主要是因为它也支持JDO并且需要它: -
如
TypedQuery<MyResultType> q = em.createQuery("SELECT x AS field1, y AS field2 FROM ...", MyResultType.class);
其中MyResultType有setter&#34; setField1&#34;,&#34; setField2&#34;。