当前位置: 首页 > 知识库问答 >
问题:

使用IN子句和subselect对多列进行Hibernate条件查询

费和惬
2023-03-14

我有一个和这个问题很相似的问题。

我正在从表1中为表2中的字段3和字段4的所有匹配唯一组合选择所有数据。

select *
from table1 as t1
where (t1.field1, t1.field2) in (select distinct field3, field4
                                 from table2 as t2
                                 where t2.id=12345);
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中的列添加到投影列表中,我无法找到删除它们的方法。

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

编辑:

@Larry.z使用HQL回答了我的问题。

我能够用Hibernate标准解决我的问题,但我必须将查询修改为:

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标准。

共有1个答案

姚臻
2023-03-14

尝试这样编写HQL查询

String hql = "from Table1 t1 where (t1.field1, t1.field2) in (
    select distinct t2.field3, t2.field4
    from Table2 t2
    where t2.id=12345)";
sessionFactory.getCurrentSession().createQuery(hql).list()
 类似资料:
  • 问题内容: 需要知道如何构造一个hibernate查询,该查询可获取与包含多个列值的子句匹配的结果。 例如, 这里将是一个二维数组,可以包含用于基本类型例如,基本包装对象,等等。 这可能吗? 问题答案: 在这里写下我如何实现此目标。基本上,我们需要从需要查询的列集中制作一个Hibernate组件(读取@Embeddable对象),并将其嵌入到主实体中。 列组可以如下组合: 将上述内容嵌入到您的主要

  • 问题内容: 我正在寻找使用sqlalchemy执行此查询。 我只想要喜欢(薰衣草和扁豆汤)或(黑胡萝卜汁)的孩子。另外,这可能是大量喜欢的颜色和食物的列表(可能> 10K),因此,我想分批进行。 问题答案: 您需要构造:

  • 问题内容: 我正在寻找使用sqlalchemy执行此查询。 我只想要喜欢(薰衣草和扁豆汤)或(黑胡萝卜汁)的孩子。另外,这可能是大量喜欢的颜色和食物的列表(可能> 10K),因此,我想分批进行。 这是相似的,但并不能完全理解: Sqlalchemy in子句 问题答案: 您需要构造:

  • 问题内容: 我有多个IN条件与子查询。 也许有更好的解决方案?就像是: 问题答案: 重新编写以代替使用。即,当某标签中没有某行的somethingId等于s.id并且id为1、2或3时,即从S返回。 也是“ null-safe”。(将完全不返回任何行。)

  • 问题内容: SELECT supplier_id FROM suppliers UNION ALL 我只是在查询的“ UNION ALL”子句上方和查询的“ UNION ALL”子句上方创建两个条件。 但是我的问题是我如何在条件中执行UNION ALL子句?提前致谢。 问题答案: 我认为hibernate不支持条件,但是您可以使用两个条件查询来获得预期的结果:

  • 问题内容: 我从table1中选择所有数据,以匹配table2中field3和field4的所有匹配唯一组合。 这是我精简的SQL: 我需要将我的SQL转换为hibernate条件。我的实体对象正确映射到了表,并将响应转换为正确的结果实体,但是我无法正确转换where子句。 我有的 我希望我的where子句类似于: 但这是hibernate所不允许的。 我尝试推出where子句以具有两个子查询,并