gpt4 book ai didi

java - hibernate 查询: new DTO clause not working

转载 作者:行者123 更新时间:2023-12-01 15:15:57 25 4
gpt4 key购买 nike

用户实体

class User{
int id;
@OneToMany
Set<Role> roles;
}

:用户类还有很多我没有写的其他细节。

DTO

class DTO{
int id;
Set<Role> roles;
DTO(int id, Set<Role> roles){
this.id = id;
this.roles= roles;
}
}

查询

hibernateTemplate.find("select new DTO(u.id, r ) from "+User.class.getName()+ " u inner join u.roles as r");

问题:抛出未找到有效构造函数的错误。

通过以下构造函数修改,上述查询可以工作:

DTO(int id, Role role){
this.id = id;
}

问题:但现在它为同一用户提供的多个 DTO 记录等于该用户所拥有的角色数。请帮忙。

最佳答案

由于您需要多行来创建单个 DTO 实例,因此您不能在查询中使用 new 运算符。相反,您必须自己创建 DTO。像这样的事情应该做:

Map<Long, DTO> dtosById = new LinkedHashMap<Long, DTO>();
List<Object[]> rows = hibernateTemplate.find("select u.id, r from User u inner join u.roles as r");
for (Object[] row : rows) {
Long id = (Long) row[0];
Role role = (Role) row[1];
DTO dto = dtosById.get(id);
if (dto == null) {
dto = new DTO(id);
dtosById.put(id, dto);
}
dto.addRole(role);
}
List<DTO> dtos = new ArrayList<DTO>(dtosById.values());

关于java - hibernate 查询: new DTO clause not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11614854/

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