Hibernate标准对子集合有多个限制

我必须使用where子句写一个条件查询来匹配子集合中的第一个和最后一个名字。 这两个名字都在不同的行中

尝试过,但即使匹配数据存在也不会返回任何内容,可能是因为它试图在同一行上匹配两个限制。

Criteria criteria = getCurrentSession().createCriteria(Form.class);
criteria.createAlias("responses", "r");
criteria.add(Restrictions
                .conjunction()
                .add(Restrictions.eq("r.id", "firstName"))
                .add(Restrictions.eq("r.value", getFirstName())));
criteria.add(Restrictions
                .conjunction()
                .add(Restrictions.eq("r.id", "lastName"))
                .add(Restrictions.eq("r.value", getLastName())));

试了这个,这给了一个例外org.hibernate.QueryException:重复的关联路径:响应

Criteria criteria = getCurrentSession().createCriteria(Form.class);
criteria.createAlias("responses", "r1");
criteria.createAlias("responses", "r2");

criteria.add(Restrictions
                .conjunction()
                .add(Restrictions.eq("r1.id", "firstName"))
                .add(Restrictions.eq("r1.value", getFirstName())));
criteria.add(Restrictions
                .conjunction()
                .add(Restrictions.eq("r2.id", "lastName"))
                .add(Restrictions.eq("r2.value", getLastName())));

任何帮助?

编辑

从描述看来,问题并不清楚。 基本要求如下:

查询表单类中的所有记录(具有id = firstName AND value = someName1的子级响应记录)AND(具有id = lastName AND value = someName2的子级响应记录)

我还使用子查询添加了适用于我的解决方案。 不知道这是否是最好的方式,但它解决了我的问题


用OR查询:

Criteria criteria = getCurrentSession().createCriteria(Form.class);
criteria.createAlias("responses", "r");
Junction conditionGroup = Restrictions.disjunction();
conditionGroup.add(Restrictions
                .conjunction()
                .add(Restrictions.eq("r.id", "firstName"))
                .add(Restrictions.eq("r.value", getFirstName())));
conditionGroup.add(Restrictions
                .conjunction()
                .add(Restrictions.eq("r.id", "lastName"))
                .add(Restrictions.eq("r.value", getLastName())));
criteria.add(conditionGroup);

我能够使用子查询来解决问题。 看起来像hibernate不支持同一子记录上的多个连接。

Criteria criteria = getCurrentSession().createCriteria(Form.class);             
DetachedCriteria subQuery1 = DetachedCriteria.forClass(Response.class);
subQuery1.add(Restrictions.and(
    Restrictions.eq("id", "firstName").add(
    Restrictions.eq("value", getFirstName())));
subQuery1.setProjection(Projections.property("formId"));

DetachedCriteria subQuery2 = DetachedCriteria.forClass(Response.class);
subQuery2.add(Restrictions.and(
    Restrictions.eq("id", "lastName").add(
    Restrictions.eq("value", getLastName())));
subQuery2.setProjection(Projections.property("formId"));
criteria.add(Restrictions.and(Subqueries.propertyIn("id", subQuery1),
                Subqueries.propertyIn("id", subQuery2)));
链接地址: http://www.djcxy.com/p/6325.html

上一篇: Hibernate criteria to have multiple restrictions on the child collection

下一篇: Hibernate Criteria Filtering by attributes of collection