簡體   English   中英

Hibernate Criteria:不同的實體然后限制

[英]Hibernate Criteria: distinct entities and then limit

我有一個標准,返回應用程序所需的所有數據,基本上:

Criteria criteria = session.createCriteria(Client.class);
criteria.createAlias("address", "address");
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.setFirstResult(init);
criteria.setMaxResults(max);
List<Client> clients = criteria.list();

問題是關系客戶端/地址是雙向的:客戶端上有一個地址,一個地址可能屬於多個客戶端。

我想基於他們的pk檢索“單個”客戶端對象,當然,在表中顯示一些客戶端。

因為首先執行setFirstResult / setMaxResults,所以我在已經應用的限制內獲得了重復的客戶端。 之后(使用的應用程序級別不是group by)hibernate獲取重復客戶端的rids,因此我最終得到了setMaxResults中指定的最大值的客戶端。

無法按(投影組)分組,因為它不會返回客戶端/地址中所需的所有列,只會返回查詢所分組的組。

(總而言之,我的表每頁有100個結果,但在丟棄重復項后我有98個結果而不是100個...)這是因為限制:LIMIT 0,100應用於休眠組之前應該執行的AFTER)

正如在“Ashish Thukral”鏈接的帖子中指出的那樣,下一行解決了這個問題:

criteria.setFetchMode("address.clients", FetchMode.SELECT);

它可以防止導致問題的連接。

當然,可以從xml配置文件中刪除fetch =“join”,但此解決方案不會影響可能正在檢索bean的其他位置。

如果您根據ID查找客戶端,如下所示。 根據您的標准,不需要max和init大小,因為它總是返回一個客戶端。

Criteria criteria = getSession().createCriteria(Client.class);
criteria .add(Restrictions.eq("id", yourClientId);
criteria.createAlias("address", "address");
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.setFirstResult(init);
criteria.setMaxResults(max);
List<Client> clients = criteria.list();

如果您根據ID查找地址,如下所示。

Criteria criteria = getSession().createCriteria(Client.class);
criteria.createAlias("address", "address");
criteria .add(Restrictions.eq("address.id", yourAddressId);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.setFirstResult(init);
criteria.setMaxResults(max);
List<Client> clients = criteria.list();

如果我正確理解您的關系,您將在每個客戶端實體類的地址和一個地址中有一個客戶列表。 所以,如果你只想要一個客戶列表,那么最重要的是,你不能只是得到它們

Criteria criteria = session.createCriteria(Client.class);
criteria.setFirstResult(init);
criteria.setMaxResults(max);
List<Client> clients = criteria.list();

為什么要創建別名並使用distinct_root_entity? 如果您需要獲取該地址,當您在DAO或ServiceImpl中訪問它時,Hibernate會為您懶散地獲取它。

如果我錯了,請糾正我。

暫無
暫無

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

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