2013-06-12 218 views
2

我使用JPA 2.0,Hibernate 4.1.0.Final和Spring 3.1.1.RELEASE。我有這樣的實體,與此字段...如何編寫JPA查詢來檢查集合是否至少有另一個集合中的一個項目?

@Entity 
@Table(name = "user") 
public class User 
{ 
    … 
    @ManyToMany 
    @JoinTable(name = "user_role", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") }) 
    @LazyCollection(LazyCollectionOption.FALSE) 
    private Set<Role> roles = new HashSet<Role>(); 

我想寫一個方法

List<User> findUsers(List<Role> roles); 

,將返回在用戶具有對參數的角色「角色的至少一個用戶「。我如何在JPA中做到這一點?我知道我可以寫

final CriteriaBuilder builder = m_entityManager.getCriteriaBuilder(); 
    final CriteriaQuery<User> criteria = builder.createQuery(User.class); 
    final Root<User> user = criteria.from(User.class); 
… 
    criteria.where(user.get("role").in(roles))); 
    final TypedQuery<User> query = m_entityManager.createQuery(criteria); 

如果用戶擁有一個角色,但在這種情況下,用戶有一組,所以我不知道如何調整上面。

+0

LazyCollection是一個Hibernate註釋,而不是JPA的註釋,因此如果需求是編寫JPA的CriteriaBuilder查詢,我會避免使用它 – perissf

回答

2

this answer,你可以以這種方式使用Expression#in()方法,前提是你使用的是基本屬性作爲參數傳遞給in表達:

Join<User, Role> rolesJoin = user.join("roles"); 
List<Integer> rolesIds = new ArrayList(); 
for (Role role : roles) { 
    rolesIds.add(role.getId()); 
} 
criteria.where(rolesJoin.get("id").in(rolesIds)); 

希望也有其他辦法讓它工作,但我還沒有找到任何其他的。

相關問題