2012-10-17 106 views
0

我有以下表格:休眠:INNER JOIN映射和未映射表使用HibernateTempate

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的表,以便我能得到有用戶分配給它的這些角色的查詢。

--edit

我有Role.id,我要檢查是否這種作用是在表的UserRole被引用。在原生SQL中,我會這樣做:

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

如何在Hibernate中使用HibernateTemplate做到這一點?

回答

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 
+0

感謝您的快速回復,但這些答案會給我基於User.id的角色集合 – Macchiato

+0

我編輯了帖子並添加了一些信息,如果它讓你感到困惑。謝謝! – Macchiato

+0

請參閱我編輯的答案。 –