Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPQL:在构造函数表达式中接收集合_Java_Jpa_Constructor_Expression_Jpql - Fatal编程技术网

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

Java JPQL:在构造函数表达式中接收集合,java,jpa,constructor,expression,jpql,Java,Jpa,Constructor,Expression,Jpql,我正在使用JPQL,希望在构造函数表达式中接收一些普通参数和集合,以直接创建DTO对象。但是如果集合为空,我总是会得到一个错误,因为他找不到正确的构造函数: DTO类如下所示: public class DTO { private long id; private String name; private Collection<Child> children; public DTO (long id, String name, Collection&

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

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;
    }
}
return (List<DTO>) getEm().createQuery("SELECT DISTINCT NEW de.DTO(p.id, p.name, p.childs) 
                                          FROM Parent p").getResultList();
现在,构造函数表达式如下所示:

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;
    }
}
return (List<DTO>) getEm().createQuery("SELECT DISTINCT NEW de.DTO(p.id, p.name, p.childs) 
                                          FROM Parent p").getResultList();
return(List)getEm()
从父项p“).getResultList();
当前的问题是,如果集合p.childs为空,则表示找不到正确的构造函数,它需要(long,String,Child)而不是(long,String,Collection)

您是否有任何解决方案,或者根本不可能在构造函数表达式中使用集合

哦,还有一件事:如果我轻松创建两个构造函数(…,Collection childs和…,Child childs),我不会得到任何结果,但也不会出错。。。在我看来,这不是一个令人满意的答案

据我所见,JPA2.0规范不允许在构造函数表达式中使用集合作为参数。第4.8节定义了如下构造函数表达式:

constructor_expression ::=
        NEW constructor_name ( constructor_item {, constructor_item}* )
constructor_item ::=
        single_valued_path_expression |
        scalar_expression |
        aggregate_expression |
        identification_variable
单值路径表达式
是一个指向某种标量的属性表达式(例如
p.id
),
标量表达式
也是一个指向标量的表达式,
aggregate\u表达式
是一个类似于
sum
的函数的应用,它将多值表达式简化为标量表达式,
identification\u变量
是对您正在查询的类型的引用。其中任何一个都不能是集合值。假设我读对了说明书

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

试试看

public DTO (long id, String name, Object children)

我遇到了类似的问题,并按照James的建议在DTO构造函数中尝试了“Object”,但传入了一个子对象,似乎它只是第一个子对象,而不是预期的子列表/子数组

我以一个“普通”查询结束,该查询在for循环中创建了所有DTO

TypedQuery<Parent> query = em.createQuery("SELECT p FROM Parent p", Parent class);
        List<Parent> list = query.getResultList();
        List<DTO> result = new ArrayList<>();
        for (Parent p : list)
        {
            DTO dto = new DTO();
            //set dto props and fill collection
            result.add(obj);
        }
        return result;
TypedQuery query=em.createQuery(“从父类p中选择p”,父类);
List=query.getResultList();
列表结果=新建ArrayList();
对于(父级p:列表)
{
DTO DTO=新的DTO();
//设置道具和填充集合的dto
结果:添加(obj);
}
返回结果;

我想你忘了把你的
家长的课发出去了。另外,
child
的复数形式是
children
。您是否尝试向查询添加条件-“WHERE p.childs不是空的,SIZE(p.childs)0”嘿,Tom Anderson,非常感谢您提供此信息。我只是在使用Eclipse链接,所以我想,如果不使用Hibernate或其他类似的东西,它也会作用于更高的层,我将不会成功@注释:是的,我忘记了父类,但我也只有一个id、一个名称和一个集合,有或没有子类。所以像“不空”这样的条件不符合我的目标,我也需要没有孩子的父母。也谢谢你的帮助。JPA 2.1中也一样,见第4.14章BNF,第211页。