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)));
我必须使用 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)));