栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Hibernate值收集标准

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Hibernate值收集标准

经过数小时的努力,我找到了解决方案。希望这对其他人有用。为了使此可行,我需要解决三个主要问题:

  1. 添加投影
  2. 创建适当的联接
  3. 正确地将子查询映射回主要条件

我在下面的代码中强调了其中的每一个。

首先,要摆脱异常,我发现子查询需要一个投影,下面突出显示。我只是对Instance的“ id”属性进行了投影。

其次,为了获得连接,我使用了Criteria.createCriteria()方法创建了一个左外部连接。因为在联接的不同级别上有多个条件,所以我必须保存联接的条件并将表达式分别附加到它们上。这让我在子查询中执行OR表达式。

最后,我必须添加一个eqProperty()子句以将子查询映射回主条件。就像它需要在结果SQL中一样,我使用了:instance.id=i.id。因为我已经将实例标准映射到“i”,并将此子句添加到“值标准”中,所以这被转换为SQL:v.instance_id =i.id。

这是工作代码:

public List<Instance> getMatchingInstances(Map<String, String> attrValues) {    Criteria crit = session.createCriteria(Instance.class, "i");    for(Map.Entry<String, String> entry : attrValues) {        String attrName = entry.getKey();        String val = entry.getValue();        // Create the subquery        DetachedCriteria valueCrit = DetachedCriteria.forClass(Value.class, "v");        // Join the Attribute object (left outer join)        DetachedCriteria attrCrit =valueCrit.createCriteria("attribute", CriteriaSpecification.LEFT_JOIN);        // Put together the OR statement on the Attribute joined criterion.        Criterion localAttr = Restrictions.eq("v.localAttributeName", attrName);        Criterion globalAttr = Restrictions.eq("name", attrName);        attrCrit.add(Restrictions.or(localAttr, globalAttr));        // Simple column equality on the subquery criterion.        valueCrit.add(Restrictions.eq("value", val));        // Map the subquery back to the outer query.        valueCrit.add(Restrictions.eqProperty("instance.id", "i.id"));        // Add the missing projection.        valueCrit.setProjection(Projections.property("id"));        // Add this subquery to the outer query.        crit.add(Subqueries.exists(valueCrit));    }    return crit.list();}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/370416.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号