Java 等价于使用变元而不是构造函数的新运算符

Java 等价于使用变元而不是构造函数的新运算符,java,jpa,jpql,Java,Jpa,Jpql,JPQL查询可以使用NEW运算符返回自定义结果对象: SELECT NEW myPackage.MyVO(e.fieldX, e.relationshipX.fieldY) FROM MyEntity AS e 这对于向VO提供信息非常有用。问题是,您必须创建与查询投影的参数数量、顺序和类型完全匹配的构造函数。当你对同一个VO使用很多投影时,这就开始变得混乱。。。要么您的VO中有一个大构造函数,并在查询中使用大量NULL文本,要么您的VO必须有许多不同的构造函数 所以我的问题是:在JP

JPQL查询可以使用
NEW
运算符返回自定义结果对象:

  SELECT NEW myPackage.MyVO(e.fieldX, e.relationshipX.fieldY)
  FROM MyEntity AS e
这对于向VO提供信息非常有用。问题是,您必须创建与查询投影的参数数量、顺序和类型完全匹配的构造函数。当你对同一个VO使用很多投影时,这就开始变得混乱。。。要么您的VO中有一个大构造函数,并在查询中使用大量
NULL
文本,要么您的VO必须有许多不同的构造函数

所以我的问题是:在JPQL中有没有一种方法可以通过变量而不是构造函数来设置结果对象字段


对于有.NET背景的人来说,我想找一个与之相当的

简短回答您不能在JPQL中使用变体

虽然我不知道
LINQ
,但我看不到这件事会不会造成混乱

现在我确信您知道类可以有多个构造函数。所以为什么不创建构造函数,这样就不会有太多的feed-in
null

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

如果您使用的是JPA2,那么条件查询可能是一个更好的选择,可以处理这类事情

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

无论哪种方式,您都需要了解SQL中不发生的对话,这样您就不会真正将任何工作转移到SQL中。我们通常更喜欢这种方法,即让SQL在一次命中中尽可能多地执行工作

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

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

  • 带参数构造函数的结果类型(如您所说)
  • 具有默认构造函数和setter的结果类型
  • 比如

    TypedQuery<MyResultType> q = em.createQuery("SELECT x AS field1, y AS field2 FROM ...", MyResultType.class);
    
    TypedQuery q=em.createQuery(“选择x作为field1,选择y作为field2 FROM…”,MyResultType.class);
    

    其中MyResultType有setter“setField1”、“setField2”。

    这是DataNucleus的一个非常好的特性,没有非标准API和我需要的行为。我一定会试试Datanucleus。DataNucleus是否有可能将其作为持久性API的新功能提出。幸运的是,我们可以为JPA2.2或JPA3:D制定一个标准。我没有计划要求它,但你可以很容易地做到。只需在他们的问题跟踪器中简单地提出一个“问题”,然后将其记录下来并可以跟踪