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

具有连接两列的子查询的Hibernate条件查询

赫连开畅
2023-03-14

我有一个表“Quote”,映射在hibernate中,它有一个由整数id和日期组成的复合键,还有几个附加列。我想编写一个条件查询,它使用DetachedCriteria来获取每个id中日期最长的行。

在sql中,我可能会编写一个查询,比如

SELECT * FROM Quote q1
  INNER JOIN (SELECT id, max(date) as maxdate FROM Quote
               GROUP BY id, date) q2
  ON q1.id = q2.id AND q1.date = q2.maxdate

在hibernate中,我认为可以像这样为“group by”子查询创建DetachedCriteria(其中Quote是映射表的类,“Qid”是键的复合id类,带有属性id和日期,由Quote类的“Qid”属性访问):

DetachedCriteria maxDateQry = DetachedCriteria.forClass(Quote.class);
maxDateQry.setProjection(
    Projections.projectionList()
        .add(Projections.max("qid.date", "maxdate"))
        .add(Projections.groupProperty("qid.id")));

然而,我不知道如何在与上面sql的外部部分等效的条件查询中使用它。我在寻找类似的东西

Criteria criteria = session.createCriteria(Quote.class);
criteria.add(
    Restrictions.and(
        Property.forName("qid.id").eq(maxDateQry???),
        Property.forName("qid.date").eq(maxDateQry???)));
List<Quote> quoteList = criteria.list();

这两个属性。上面的forName将外部表与子查询的相应列相关联。如果内部联接只提供一个值,我只需为DetachedCriteria提供一个投影,并将DetachedCriteria直接传递到属性中。forName(…)。等式(…)。我不知道如何在投影中使用带有两个值(id和maxdate)的DetachedCriteria。

共有2个答案

戎俊
2023-03-14

我有一个类似的用例。我很确定这不能用标准来完成。Hibernate不支持from子句中的联接:https://hibernate.atlassian.net/browse/HHH-3356(撰写本文时仍处于打开状态)。

2013年圣诞节的答案很好,但不幸的是,在我的使用案例中,相关子查询非常糟糕:

  • 使用MySQL

但这个很好(无论如何,对于MySQL 5.6.25):

SELECT * FROM Quote q1
WHERE (q1.id, q1.date) IN 
(
    SELECT id, max(date)
    FROM Quote
    GROUP BY id, date
)

我来这里是想知道

DetachedCriteria maxDateQry = DetachedCriteria.forClass(Quote.class);
maxDateQry.setProjection(
    Projections.projectionList()
        .add(Projections.groupProperty("qid.id"))
        .add(Projections.max("qid.date", "maxdate"))
    );

Criteria criteria = session.createCriteria(Quote.class);
Object environmentIdAndStartedDateProperty = "(environmentId, startedDate)" // but not this, some sort of magic
criteria.add(
    Subqueries.in(environmentIdAndStartedDateProperty, maxDateQry));
List<Quote> quoteList = criteria.list();

但似乎不存在这样的魔法。我不得不放弃并使用hql,这可能是最好的,因为根据Hibernate 4.2文档,Hibernate criteria API无论如何都是不推荐的:https://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/apb.html

华宣
2023-03-14

具有完全相同的问题,无法找到多列子查询匹配的精确解决方案。我所做的是重写查询,以便它只需要匹配一列上的子选择。因此

SELECT *
FROM Quote q1
INNER JOIN (
    SELECT id, MAX(date) AS maxdate
    FROM Quote
    GROUP BY id
) q2
    ON q1.id = q2.id AND q1.date = q2.maxdate;

尝试:

SELECT *
FROM Quote q1
WHERE q1.date = (SELECT MAX(date) FROM Quote inner where inner.id = q1.id)

关键的区别在于,连接条件的最大条件的所有栏现在都位于内部选择内。

此操作的条件/分离条件如下所示:

DetachedCriteria innerCriteria = DetachedCriteria.forClass(Quote.class, "inner")
    .add(Restrictions.eqProperty("inner.id","q1.id"))
    .setProjection(Projections.projectionList().add(Projections.max("inner.date")));

DetachedCriteria outerCriteria= DetachedCriteria.forClass(ClmClaim.class, "q1");
outerCriteria.add(Subqueries.propertyEq("q1.date", innerCriteria ));

产生的SQL如下:

select
        this_.<Blah> as blah2_49_0_,
        this_.<Blah> as blah2_50_0_,
        this_.<Blah> as blah2_51_0_,

    from
        Quote this_ 
    where
         this_.date = (
            select
                max(inner_.date) as y0_ 
            from
                Quote inner_ 
            where
                inner_.claim_number=this_.claim_number
        );

您会注意到SQL中没有“group by”,因为它不需要。如果子选项中有多个匹配条件,我希望有一个。

不管怎样,希望能有所帮助。这是我在圣诞节前要做的最后一件事!

 类似资料:
  • 问题内容: 怪物编辑:查询现在将运行,但返回错误答案。添加了一个粗略的架构。PatientID不是tblPatientVisits表中的主键,因为同一患者ID可以出现多次。 列出了每个县名,但每个计数(s.countyName)和计数(t.countyname)为1 编辑:我有一个查询,现在运行,但它返回 问题答案: 没有样本数据和理想的结果很难说,但是也许这是您要追求的?

  • subcompany.hbm.xml 子单位表 branch.java 指定表 我需要帮助编写条件查询使用提供的SQL。

  • 我最近在尝试按两个同等重要的列排序一个Hibernate Criteria查询时遇到了这个问题。基本上,我的意思是,如果我有一个表,其中一个列是一个日期(createdOnDate),另一个列是一个日期(modifiedOnDate),我希望比较来自Organization Object的orderBy子句中的所有日期。 为此,我这样尝试: 但是它首先根据modified_date对所有组织进行排

  • 大家好,我在使用jparepository使用@query连接两个表时遇到了一个小问题,但我得到了错误。请帮我做这个。

  • 我有一张这样的桌子: MySQL>按id限制11从MyTable顺序中选择id、书籍、章节、段落、RevisionNum; 要找到没有未修改段落的书籍或章节,我希望查询该章节或书籍的所有不同id的最大值的最小值,或者以某种方式确定没有id保持未编辑(MAX(RevisionNum)为零)。 我的大多数约会尝试都以这样的错误告终: ...而我根本就没有使用“group by”函数! 下面的查询生成结

  • 问题内容: 我在ms access 2010中有2个表,如下所示 我想从贷款表中选择名称而不是数字(l_from&l_to) 问题答案: 两次这样的表: SQL Fiddle演示(它是SQL Server 2008,但我认为ms- access的语法应相同)