用户实体

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


:User类还有很多其他细节,我还没有写。

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 查询:新的DTO子句不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11614854/

10-16 01:19