Java Hibernate条件对子集合具有多个限制

Java Hibernate条件对子集合具有多个限制,java,hibernate,hibernate-criteria,Java,Hibernate,Hibernate Criteria,我必须使用where子句编写一个条件查询,以匹配子集合中的名字和姓氏。两个名称在不同的行中 尝试了此操作,但即使存在匹配的数据,也不会返回任何内容,可能是因为它试图匹配同一行上的两个限制 Criteria criteria = getCurrentSession().createCriteria(Form.class); criteria.createAlias("responses", "r"); criteria.add(Restrictions .conju

我必须使用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:duplicate association path:responses

有什么帮助吗

编辑

从描述上看,问题似乎不清楚。以下是基本要求:

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

所以,如果我理解你的问题:你想用OR而不是AND来查询?@jpprade我实际上想要一个AND@NarainMittal,我想你的理解有点混乱。当需要触发对两个不同行有限制的查询时,必须使用或而不是AND。当您说AND时,这两个限制将应用于同一行。因此,jpprade建议您的是正确的解决方案。@RAS对未能尽快响应表示歉意,但请检查编辑。我确实需要一个和。还可以看到对您有效的答案me@NarainMittal伟大的接受对你有用的答案,这样将来的访客就可以被引导。
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)));