2011-02-24 184 views
2

所以,我有一个相当复杂的查询,我试图使用Hibernate Criteria API。我有以下实体类:休眠标准限制选择

代码
礼品
GiftVendor
GiftVendorStatus

有以下关系:

码1 <> 1礼品
礼品1 <> * GiftVendor
GiftVendor 1 <> 1个GiftVendorStatus

我需要建立一个标准查询,返回代码对象的名单,但是它限制了有一个礼物,至少有一个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(); 

这给了我一个代码对象列表,如我所期望的那样受限制。但是,它还会执行附加查询来构建Gift对象的所有未使用关系,即使我已将所有映射设置为Lazy的获取模式。这会为我的每个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); 

该代码给我的代码对象的名单,不出所料,没有做所有额外的查询来填充送礼对象。我如何告诉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 

​​

回答

0

Hibernate documentation

连接抓取:Hibernate通过在SELECT语句的相关实例或集合,使用OUTER JOIN。

换句话说,尝试使用base.setFetchMode( “礼物”,FetchMode.JOIN)语句

我希望帮助。

干杯

+0

尽管这里指定的具体建议并未解决问题,但它确实指出了我如何解决问题的正确方向。我用新的结果更新了我的问题。但是,这仍然不太合适,因为我必须为我的Gift对象中的所有一对一映射添加该行,此时应该应用默认映射。 – 2011-02-25 00:56:28