Java JPA CriteriaQuery查询每个实体的最新数据

Java JPA CriteriaQuery查询每个实体的最新数据,java,hibernate,jpa,jpql,Java,Hibernate,Jpa,Jpql,我有一个项目使用SpringBoot 1.5.9(无法更改版本) 我有以下实体: @Entity @Table(name = "data") public class DataEntity extends Timestampable { @Column(name = "value") private String value; @Column(name = "data_timestamp") private ZonedDateTime dataTimestam

我有一个项目使用SpringBoot 1.5.9(无法更改版本)

我有以下实体:

@Entity
@Table(name = "data")
public class DataEntity extends Timestampable {

    @Column(name = "value")
    private String value;

    @Column(name = "data_timestamp")
    private ZonedDateTime dataTimestamp;

    @ManyToOne
    @JoinColumn
    private DataTypeEntity type;

    @ManyToOne
    @JoinColumn
    private AssetEntity asset;
}

@Entity
@Table(name = "data_type")
public class DataTypeEntity extends Timestampable {

    @Column(name = "name", unique = true)
    private String name;

    ...
}
我有一个工作SQL查询(在PostgreSQL下),用于检索每个资产的最新数据():

我想把这个查询转换成JPA标准查询。 有没有办法做到这一点,或者我需要在特定实体上使用@SubSelect注释

谢谢你读这篇文章

(丑陋)解决方案

最后,我使用了一个数据库视图和一个子选择。 我已将我的DataEntity拆分为两个实体:

@Entity
@Table(name = "data")
public class DataEntity extends Timestampable {

    @Column(name = "value")
    private String value;

    @Column(name = "data_timestamp")
    private ZonedDateTime dataTimestamp;

    @ManyToOne
    @JoinColumn
    private DataTypeEntity type;

    @ManyToOne
    @JoinColumn
    private AssetEntity asset;
}

@Entity
@Table(name = "data_type")
public class DataTypeEntity extends Timestampable {

    @Column(name = "name", unique = true)
    private String name;

    ...
}
  • 一个是操纵数据
  • 另一个视图,仅用于检索最新数据
  • 基类:

    @MappedSuperclass
    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
    public abstract class AbstractDataEntity extends Timestampable {
    
        @Column(name = "value")
        protected String value;
    
        ...
    
    }
    
    操纵类:

    @Entity
    @SequenceGenerator(name = "idgen", sequenceName = "data_seq")
    @Table(name = "data")
    @DiscriminatorValue("DataEntity")
    public class DataEntity extends AbstractDataEntity {
        @Override
        public DataEntity setValue(String value) {
            super.setValue(value);
            return this;
        }
    
       ...
    }
    
    视图类:

    @Entity
    @Immutable
    @SequenceGenerator(name = "idgen", sequenceName = "view_data_last_seq")
    @DiscriminatorValue("LastDataView")
    @Subselect(
        "SELECT * FROM data d1 " +
        "JOIN ( " +
        "  SELECT max(d.data_timestamp) as newest, d.asset_id, d.type_id FROM data d " +
        "  WHERE d.parameter_id IS NULL " +
        "  GROUP BY d.asset_id, d.type_id" +
        ") d2 " +
        "ON d1.data_timestamp = d2.newest " +
        "  AND d1.asset_id = d2.asset_id " +
        "  AND d1.type_id = d2.type_id"
    )
    public class LastDataView extends AbstractDataEntity {
    }
    
    即使我觉得这个解决方案很难看,它可能会帮助别人

    JPQL子查询
    FROM
    JOIN
    。仅在
    其中
    或具有子句的
    中。Eclipse链接,支持对
    FROM
    子句的子查询


    因为,不可能使用条件来做您想要做的事情。

    我认为您不能在JPQL中的select语句中执行子查询。