簡體   English   中英

休眠條件限制選擇

[英]Hibernate Criteria limit select

因此,我嘗試使用Hibernate Criteria API進行一個相當復雜的查詢。 我有以下實體類:


禮品
禮品供應商
GiftVendorStatus

具有以下關系:

代碼1 <> 1禮物
禮品1 <> * GiftVendor
GiftVendor 1 <> 1 GiftVendorStatus

我需要建立一個Criteria查詢,該查詢返回一個Code對象列表,但將其限制為僅具有Gift且其GiftVendor至少具有一個GiftVendorStatus在線的代碼。 這是我用來建立標准的代碼:

Criteria base = CodeDao.getBaseCriteria();
base.createAlias("gift","gift");
base.createAlias("gift.giftVendor","giftVendor");
base.createAlias("giftVendor.giftVendorStatus","giftVendorStatus");
base.add(Restrictions.like("giftVendorStatus.description", "Online%"));
return base.list();

這給了我一個Code對象列表,正如我所期望的那樣受到限制。 但是,即使我已將所有映射設置為Lazy的獲取模式,它也會執行其他查詢以構建Gift對象的所有未使用關系。 這將為我的10000多個結果中的每個結果另外產生4個單獨的查詢。

我有代碼可以使用按預期方式運行的HQL進行查詢:

String hql = "select c FROM Code c inner join c.gift g inner join g.giftVendors gv inner join gv.giftVendorStatus gvs" +
    " WHERE gvs.description like :desc";
HashMap<String,Object> params = new HashMap<String, Object>();
params.put("desc", "Online%");
return performQuery(hql, params);

如預期的那樣,該代碼為我提供了一個Code對象列表,而無需執行所有其他查詢來填充Gift對象。 如何告訴Hibernate不要使用Criteria API進行那些額外的查詢?

更新:這里的問題不是禮物表的檢索,而是禮物表中不相關的一對一關系。 例如,Gift與GiftCommentAggregateCache具有一對一的關系。 該表與該特定查詢完全無關,因此我希望可以應用惰性初始化規則,並且除非嘗試讀取,否則不會對GiftCommentAggregateCache進行查詢。 但是,使用上面寫出的Criteria查詢,它使該單獨的查詢填充了GiftCommentAggregateCache的模型對象。

如果我使用:

base.setFetchMode("gift.giftCommentAggregateCache", FetchMode.JOIN);

那我就沒有任何問題 但是,這意味着要使此功能按我期望的那樣工作,我需要為Gift所具有的每個未使用的一對一關系添加該行。 關於為什么映射中指定的惰性規則在這里沒有起作用的任何想法?

我嘗試了幾種不同的方法:

base.setFetchMode("gift", FetchMode.LAZY); // Still does additional queries

base.setFetchMode("gift", FetchMode.SELECT); // Still does additional queries

base.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); // Still does additional queries

base.setResultTransformer(Criteria.ROOT_ENTITY); // Still does additional queries

base.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP); // Still does additional queries

base.setProjection(Projections.property("gift")); // Does not do additional queries, but incorrectly returns a List of Gift objects, instead of a List of Code objects

Hibernate文檔中

聯接獲取:Hibernate使用OUTER JOIN檢索同一SELECT中的關聯實例或集合。

換句話說,嘗試使用base.setFetchMode(“ gift”,FetchMode.JOIN)

希望對您有所幫助。

干杯

暫無
暫無

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

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