相当于使用mutator而不是构造函数的NEW运算符

时间:2012-06-19 00:47:53

标签: java jpa jpql

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

2 个答案:

答案 0 :(得分:1)

简短回答你不能在JPQL中使用mutators。

虽然我不知道LINQ但我没有看到这样做而不会造成混乱。

现在我确信你知道Classes可以有多个构造函数。那么为什么不创建一些你不会在null中输入的构造函数。

根据您的需要和您正在使用的JPA实施,大多数提供商都会提供非标准的方法。例如。 Hibernate有@formula,在某些情况下使用它来代替使用构造函数。

我使用JPA2然后标准查询可能是更好的选择,可以处理这些事情。

在某些情况下,您可能更喜欢使用@PostLoad

无论哪种方式,您都需要知道SQL中没有发生这种转换,因此您实际上并没有将任何工作卸载到SQL。我们通常更喜欢,即使SQL在单击中尽可能多地工作。

是的,这些是我的概括,具体的解决方案或要求可能不适合。

答案 1 :(得分:1)

DataNucleus JPA当然支持两种使用非标准注释或调用实例化结果对象的方法,主要是因为它也支持JDO并且需要它: -

  1. 带有争论构造函数的结果类型(如您所说)
  2. 具有默认构造函数的结果类型,以及使用setter
  3. TypedQuery<MyResultType> q = em.createQuery("SELECT x AS field1, y AS field2 FROM ...", MyResultType.class);
    

    其中MyResultType有setter&#34; setField1&#34;,&#34; setField2&#34;。