所以,我有一个相当复杂的查询,我试图使用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
和
尽管这里指定的具体建议并未解决问题,但它确实指出了我如何解决问题的正确方向。我用新的结果更新了我的问题。但是,这仍然不太合适,因为我必须为我的Gift对象中的所有一对一映射添加该行,此时应该应用默认映射。 – 2011-02-25 00:56:28