【问题标题】:Hibernate: Inner Join Mapped and Unmapped Table using HibernateTempateHibernate:使用 HibernateTempate 进行内部连接映射和未映射表
【发布时间】:2012-10-17 10:25:46
【问题描述】:

我有以下表格:

USER
    ID VARCHAR(32) INTEGER NOT NULL

ROLE
    ID INTEGER NOT NULL

USERROLE /*Many to Many*/
    USER_ID VARCHAR(32) NOT NULL
    ROLE_ID INTEGER NOT NULL

我正在使用注释将数据库表映射到我的类。

/* Mapping for USER table */
@Entity
@Table (name="USER")
public class User{
    @Id
    @Column (name="ID")
    private String id;

    @ManyToMany 
    @JoinTable (name="USERROLE", joinColumns = {@JoinColumn (name="USER_ID")}, 
            inverseJoinColumns = {@JoinColumn (name="ROLE_ID")})
    @LazyCollection (LazyCollectionOption.FALSE)
    private List<Role> roles;
}

/* Mapping for ROLE table */
@Entity
@Table (name="ROLE")
public class Role {
    @Id
    @Column (name="ID")
    private int id;

}

现在我想做一个连接 ROLE 和 USERROLE 表的查询,这样我就可以获得那些分配了用户的 ROLE。

--编辑

我有 Role.id,我想检查 USERROLE 表中是否引用了此角色。在原生 SQL 中,我会这样做:

SELECT DISTINCT A.* from ROLE A INNER JOIN USERROLE B 
WHERE A.ID = B.ROLE_ID AND A.ID = ?;

如何在休眠中使用 HibernateTemplate?

【问题讨论】:

    标签: hibernate many-to-many


    【解决方案1】:

    这很简单:

    select role from User user inner join user.roles role where user.id = :userId
    

    甚至更简单,无需任何查询:

    User user = (User) session.get(User.class, userId);
    return user.getRoles();
    

    编辑:要知道给定角色是否被至少一个用户引用,您可以使用以下查询,这与您的 SQL 查询非常相似:

    select distinct role from User user 
    inner join user.roles role 
    where role.id = :roleId
    

    【讨论】:

    • 感谢您的快速回复,但这些答案将为我提供基于 User.id 的角色集合
    • 我编辑了帖子并添加了一些信息,如果它让您感到困惑。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    相关资源
    最近更新 更多