簡體   English   中英

使用Hibernate Criteria API查詢實體沒有特定值的多對多關聯

[英]Querying many to many association where the entity doesn't have a certain value using Hibernate Criteria API

我有兩個類User和Role,它們使用多對多關聯映射到彼此。 現在我正在嘗試使用Hibernate Criteria API查詢沒有特定角色的所有用戶。 但我有點卡住了。

要查詢具有特定角色的用戶,我使用以下查詢,該工作正常。

Session session = getSessionFactory().getCurrentSession();          
Criteria mainCrit = session.createCriteria(boClass);
return mainCrit.createAlias("roles", "r").add( Restrictions.eq("r.name", roleName)).list();

現在我有點困惑如何反轉查詢並讓所有沒有特定角色的用戶。 如果可能的話,我想明確地排除某個角色,並且不要查詢用OR鏈接它們的所有角色,因為以后可能會動態添加更多角色。

UPDATE

為了更好地理解我的場景,你可以看到我試圖在另一個問題中查詢的關聯。

此外,我還要補充一點,Role類的name屬性是一個Enum,不知道這是重要的還是改變了查詢數據庫的方式。

也許有一種更優雅的方式,但我發現的唯一一種方法是查詢具有給定角色名稱的用戶角色中不存在任何角色的所有用戶。

這樣做是這樣的:

Criteria c = session.createCriteria(User.class, "user");

DetachedCriteria roleOfUserWithName = DetachedCriteria.forClass(Role.class, "role");
roleOfUserWithName.createAlias("role.users", "userOfTheRole");
roleOfUserWithName.add(Restrictions.eqProperty("userOfTheRole.id", "user.id"));
roleOfUserWithName.add(Restrictions.eq("role.name", roleName);
roleOfUserWithName.setProjection(Projections.id());

c.add(Subqueries.notExists(roleOfUserWithName));

它等同於以下HQL查詢:

select user from User user where not exists (
    select role.id from Role role inner join role.users userOfTheRole
    where userOfTheRole.id = user.id
    and role.name = :roleName);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM