簡體   English   中英

獲取集合計數而不是JPA Criteria API中的集合?

[英]Get collection count instead of the collection in JPA Criteria API?

可以說我有一個實體:

@Entity
public class Person {

    @Id
    @GeneratedValue
    private Long id;

    @ManyToMany(fetch = FetchType.LAZY)
    private List<Role> roles;

    @ManyToMany(fetch = FetchType.LAZY)
    private List<Permission> permissions;
    // etc
    // other fields here
}

我想要一個使用Criteria API構建查詢,該查詢可過濾這些用戶並顯示人員列表以及該實體的其他信息-一個人有多少個角色。

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Person> query = builder.createQuery(Person.class);
Root<Person> personRoot = query.from(Person.class);
// predicates here

但是,這將我限制為僅返回一個Person實體列表。 我總是可以向實體添加@Transient字段,但這似乎很丑陋,因為我可能有很多不同的查詢,並且最終可能會有很多這樣的字段。

另一方面-我不能使用HQL並編寫查詢,因為我要進行復雜的過濾,因此必須處理從HQL查詢中添加和刪除內容的問題。

我的問題,除了本文標題中的問題之外,是這樣的:我如何使用Criteria API查詢數據庫並返回一個非實體(以防我要過濾Person表但僅返回角色數量,權限等),以及如何針對非常接近實際實體的東西(例如使用角色計數器而不是角色集合的示例)進行處理?

更新使用Hibernate的預測,我想到了這一點。 但是仍然不知道用TODO編寫。 Projections.count無法正常工作,因為它需要某種分組方式,而且我似乎無法在Hibernate文檔中找到任何示例。

Criteria cr = session.createCriteria(Person.class);

if (id != null) {
    cr.add(Restrictions.eq("id", id));
}

ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.property("id"), "id");
projectionList.add(TODO, "rolesCount");

我該如何針對非常接近實際實體的事物執行此操作(例如使用角色計數器而不是角色集合的示例

您可以通過多種方式(例如,使用Hibernate @Forumula屬性)為User實體設置這些value屬性。 這將在實體加載時發出內聯子查詢,以在不觸及集合的情況下獲得計數。

@Formula("select count(*) from roles where user_id = ?")
private int numberOfRoles;

另一個(符合JPA的)選項是通過在數據庫級別創建一個視圖並將其映射到您的用戶來處理這些計算出的字段:

例如

@OneToOne
private UserData userData; //entity mapped to your view (works just like a table)

....

public int getNumberOfRoles(){
   return userData.getRoleCOunt();

要么

通過使用@SecondaryTable聯接此用戶數據。

CriteriaQuery<Long> query = entityManager.getCriteriaBuilder().get().createQuery(Long.class);
query.select(builder.get().countDistinct(root));

為我工作:)

暫無
暫無

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

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