Bor*_*vat 5 mapping annotations hibernate criteria duplicates
所以我有一个Users表,Projects表和User_Roles表.我有一个用户连接到2个项目,但是当我只有一个角色时,它会返回这2个项目,但如果我有2个角色,则返回4个角色(2x2个项目).我如何防止这种情况发生
这是我返回用户项目列表的代码
@Override
public List<Project> retrieve(User user) {
Criteria criteria = super.createCriteria();
criteria.addOrder(Order.desc("date"));
criteria.createCriteria("users").add(Restrictions.eq("id", user.getId()));
return (List<Project>) criteria.list();
}
Run Code Online (Sandbox Code Playgroud)
用户类中的映射
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "Users_Projects",
joinColumns = @JoinColumn(name = "UserID"), inverseJoinColumns = @JoinColumn(name = "ProjectID"))
public List<Project> getProjects() {
return projects;
}
@ElementCollection(fetch = FetchType.EAGER)
@Enumerated(EnumType.STRING)
@Column(name = "RoleType")
@JoinTable(name = "User_Roles", joinColumns = @JoinColumn(name = "UserID"))
public Set<Role> getRoles() {
return roles;
}
Run Code Online (Sandbox Code Playgroud)
有什么建议在这里有什么问题吗?
TNX
Don*_*oby 13
标准查询中重复行问题的经典"修复",只要您不尝试将其与分页相结合,这可能会有效
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
Run Code Online (Sandbox Code Playgroud)
我相信在您的情况下会发生这种情况,因为用户角色的加载很少.将其变为懒惰也可能有效,并且如果您需要分页,则继续工作.
设置fetch = FetchType.EAGER指示您希望在检索用户时始终为用户加载所有角色的hibernate,它通过始终连接到roles表来完成.
不幸的是,该sql导致具有相同用户的多个记录(每个角色一个),然后在运行sql之后必须在Java中理顺,这就是结果转换器的作用.
更不幸的是,如果你想以最自然的方式使用简单的休眠标准,使用criteria.setFirstResult和criteria.setMaxResults,事情以错误的顺序发生,所以这些需要结果转换器以避免重复的查询只是不能正确页面.
为了更好地理解所有hibernate sql生成,我建议打开生成的sql的日志记录,如另一个SO hibernate问题的答案所述.
| 归档时间: |
|
| 查看次数: |
5977 次 |
| 最近记录: |