我有一个与这个问题非常相似的问题。
我正在为 table2 中 field3 和 field4 的所有匹配唯一组合选择 table1 中的所有数据。
这是我的精简 SQL:
select *
from table1 as t1
where (t1.field1, t1.field2) in (select distinct field3, field4
from table2 as t2
where t2.id=12345);
我需要将我的 SQL 转换为 Hibernate Criteria。我让我的实体对象正确映射到表并将响应转换为正确的结果实体,但我无法正确翻译我的 where 子句。
是)我有的
Criteria criteria = getSession().createCriteria(Table1.class);
DetachedCriteria subquery = DetachedCriteria.forClass(Table2.class);
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.property("field3"), "field3");
projectionList.add(Projections.property("field4"), "field4");
subquery.setProjection(Projections.distinct(projectionList));
subquery.add(Restrictions.eq("id", 12345));
我希望我的 where 子句类似于:
criteria.add(Subqueries.in("field1, field2", subquery));
但是 Hibernate 不允许这样做。
我已经尝试推出 where 子句以拥有两个子查询并根据结果检查 field1 和 field2,但似乎子查询总是必须返回多个列。我使用 group by 做到了这一点,但 Hibernate 会自动将 group by 中的列添加到投影列表中,我找不到删除它们的方法。
这是使用 group by 的相同查询:
select *
from table1 as t1
where t1.field1 in (select field3
from table2 as t2
where t2.id=12345
group by field3, field4)
and t1.field2 in (select field4
from table2 as t2
where t2.id=12345
group by field3, field4);
是否可以使用 Hibernate Criteria 执行我的 where 子句?
如果无法使用 Hibernate Criteria,是否可以使用 HQL 执行我的 where 子句?
编辑:
@Larry.Z 使用 HQL 回答了我的问题。
我能够用 Hibernate Criteria 解决我的问题,但我不得不将查询修改为:
select *
from table1 as t1
where exists (select 1
table2 as t2
where t2.id=12345
and t2.field3=t1.field1
and t2.field4=t1.field2);
翻译成休眠标准:
Criteria criteria = getSession().createCriteria(Table1.class, "t1");
DetachedCriteria subquery = DetachedCriteria.forClass(Table2.class, "t2");
subquery.add(Restrictions.eq("t2.id", 12345));
subquery.add(Restrictions.eqProperty("t2.field3", "t1.field1"));
subquery.add(Restrictions.eqProperty("t2.field4", "t1.field2"));
subquery.setProjection(Projections.property("t2.id")); // select the ID rather than 1
我仍然很好奇是否可以使用我原来的 SQL 来编写 Hibernate Criteria。