0

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的东西。

4

2 回答 2

1

简短回答,您不能在 JPQL 中使用增变器。

虽然我不知道LINQ我不能看到这没有造成混乱。

现在我确定你知道类可以有多个构造函数。那么为什么不创建你不会有太多的构造函数null

根据您的需要和您使用的 JPA 实现,大多数提供程序确实提供了非标准的方法来解决它。例如,Hibernate@formula在某些情况下使用它来代替使用构造函数。

如果您使用的是 JPA2,那么标准查询可能是更好的选择,并且可以处理这类事情。

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

无论哪种方式,您都需要知道这种转换不会发生在 SQL 中,因此您并没有真正将任何工作卸载到 SQL 。我们通常更喜欢让 SQL 在单次点击中完成尽可能多的工作。

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

于 2012-06-19T00:58:55.377 回答
1

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

  1. 带参数构造函数的结果类型(如你所说)
  2. 具有默认构造函数和设置器的结果类型

TypedQuery<MyResultType> q = em.createQuery("SELECT x AS field1, y AS field2 FROM ...", MyResultType.class);

其中 MyResultType 具有设置器“setField1”、“setField2”。

于 2012-06-19T06:57:18.010 回答