[英]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.