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

Hibernate criteria to have multiple restrictions on the child collection

我必须使用 where 子句编写条件查询以匹配子集合中的名字和姓氏。两个名字在不同的行

试过这个,但即使存在匹配数据也没有 return 任何东西,可能是因为它试图在同一行上匹配两个限制。

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())));

有什么帮助吗?

编辑

从描述上看,问题好像没有说清楚。这是基本要求:

查询表单 class 中的所有记录,这些记录具有(具有 id=firstName AND value=someName1 的子响应记录)和(具有 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)));