【问题标题】:Springboot with JPA: inner join with same table带有 JPA 的 Spring Boot:与同一张表的内部连接
【发布时间】:2020-05-07 17:16:52
【问题描述】:

我有一个实体如下:

    @Entity(name = "TEMP_TABLE")
    public class TempEntity {
        @Id
        private UUID id;
        private String name;
        private String addressLine;
        @Convert(converter = ZonedDateTimeConverter.class)
        private ZonedDateTime createdDateTime;    
    }

我想使用JPAcriteria builder 执行以下查询:


    SELECT
        T1.* 
    FROM
        TEMP_TABLE T1 
    INNER JOIN
        (
            SELECT
                name,
                MAX(created_date_time) AS MaxDateTime        
            FROM
                TEMP_TABLE 
            GROUP BY
                name
        ) T2             
            ON T1.name = T2.name                 
            AND T1.created_date_time = T2.MaxDateTime;

目的是从TEMP_TABLE获取每个名称的最新记录(包含所有列)。

你能帮帮我吗?

【问题讨论】:

  • 看起来TEMP_TABLE.* 应该是T1.*T2.*
  • 抱歉,我已经更正了

标签: hibernate jpa criteria criteria-api jpa-2.1


【解决方案1】:

更改查询:

SELECT * FROM TEMP_TABLE T1 WHERE T1.created_date_time = 
(SELECT MAX(T2.created_date_time) FROM TEMP_TABLE T2 WHERE T2.name = T1.name GROUP BY T2.name);

可以这样实现:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<TempTable> cq = cb.createQuery(TempTable.class);

Root<TempTable> rootT1 = cq.from(TempTable.class);

//Create Subquery
Subquery<Date> sq = cq.subquery(Date.class);
Root<TempTable> rootT2sq = sq.from(TempTable.class);
//Set Condition between T1 y T2
sq.where(cb.equal(rootT1.get(TempTable_.name),rootT2sq.get(TempTable_.name)));
sq.select(cb.greatest(rootT2sq.get(TempTable_.createdDateTime)));
sq.groupBy(rootT2sq.get(TempTable_.name));

//Set condition equal max
cq.where(cb.equal(rootT1.get(TempTable_.createdDateTime),sq.getSelection()));
cq.select(rootT1);

entityManager.createQuery(cq).getResultList();

【讨论】:

    猜你喜欢
    • 2021-09-16
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多