gpt4 book ai didi

java - JPQL:在构造函数表达式中接收集合

转载 作者:搜寻专家 更新时间:2023-10-30 19:57:31 25 4
gpt4 key购买 nike

我正在使用 JPQL 并希望在构造函数表达式中接收一些普通参数和一个集合以直接创建 DTO 对象。但是如果Collection是空的,我总是报错,因为他没有找到正确的构造函数:

DTO 类如下所示:

public class DTO {
private long id;
private String name;
private Collection<Child> children;

public DTO (long id, String name, Collection<Child> children){
this.id = id;
this.name = name;
this.children= children;
}
}

子类:

public class Child {
private String name;
private int age;
}

现在构造函数表达式如下所示:

return (List<DTO>) getEm().createQuery("SELECT DISTINCT NEW de.DTO(p.id, p.name, p.childs) 
FROM Parent p").getResultList();

当前的问题是,如果 Collection p.childs 为空,它表示找不到正确的构造函数,它需要 (long, String, Child) 而不是 (long, String, Collection)。

您有任何解决方案吗?还是根本不可能在构造函数表达式中使用集合?

哦,还有一件事:如果我轻松创建两个构造函数(...,Collection childs AND ...,Child childs)我没有得到任何结果,但也没有错误......在我看来并不令人满意:-/

最佳答案

JPA 规范(至少版本 2.0、2.1 和 2.2)不允许使用集合作为构造函数表达式中的参数。 4.8 节定义了一个构造函数表达式,如下所示:

constructor_expression ::=
NEW constructor_name ( constructor_item {, constructor_item}* )
constructor_item ::=
single_valued_path_expression |
scalar_expression |
aggregate_expression |
identification_variable

single_valued_pa​​th_expression 就像它听起来的那样 - 一个指向某种标量(例如 p.id)的属性表达式,一个 scalar_expression 也是一个指向标量的表达式,一个 aggregate_expression 是一个像 sum 这样的函数的应用,它将一个多值表达式简化为一个标量表达式,一个identification_variable 是对您正在查询的类型的引用。都没有 Collection 值(value)。

因此,如果您的 JPA 提供程序允许您在构造函数表达式中使用集合值参数,那是因为它超出了规范。这是非常好的,但不是你必须依赖的东西!

关于java - JPQL:在构造函数表达式中接收集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5998409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com