java - 如何在 Hibernate jpa 中正确选择具有 OneToMany 关系的实体

标签 java hibernate

我有两个表(实体):

@Entity
@Table(name = "users")
@NamedQuery(name = "User.getAll", query = "SELECT c from User c")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @NotNull
    @Column(name = "LOGIN")
    private String login;

    @Column(name = "PASSWORD", length = 64)
    private String password;

    @Column(name = "SALT", length = 80)
    private String salt;

    @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
    private Set<Role> roles;

    @OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private Set<Permission> permissions;

@Entity
@Table(name = "roles")
@NamedQuery(name = "Role.getAll", query = "SELECT c from Role c")
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "ROLE_NAME", length = 100)
    private String roleName;

    @ManyToMany(mappedBy = "roles")
    private Set<User> users;

以及选择用户的方法:

@Override
    public List<User> getUsersList() {
        Criteria criteria = getSession().createCriteria(User.class);
        return (List<User>)criteria.list();
    }

我有 2 个用户。第一个用户有 2 个角色,第二个用户有 1 个角色。 但是这个方法返回了 3 个用户。具有 2 个角色的用户是重复的。

我尝试了 criteria.createCriteria("", JoinType.NONE);

但这并没有帮助。

最佳答案

你需要使用criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY),检查: criteria-distinct-root-entity-vs-projections-distinct

关于java - 如何在 Hibernate jpa 中正确选择具有 OneToMany 关系的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34488146/

相关文章:

java - 在上下文 Tomcat 7 上启用自动部署

java - 如何从 java 代码为我的 jpa 实体创建一个 ddl?

java - Jackson ObjectMapper hibernate 问题

java - 如何在 SQL 查询中安全地使用 * 作为通配符

java - 深层对象图 hibernate

java - JPA-Hibernate教程: Explicit persistence provider error-Could not create Configuration

java - 这两种算法中哪一种更有效?

java - 将 Intellij SDK 指向 jenv 定义的 java home

java - 无法使用打印机打印标签

Java:附加字符串需要删除某些部分