Java JPQL:在构造函数表达式中接收集合
我正在使用JPQL,希望在构造函数表达式中接收一些普通参数和集合,以直接创建DTO对象。但是如果集合为空,我总是会得到一个错误,因为他找不到正确的构造函数: DTO类如下所示: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&
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页。