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

我有一个使用 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 下),以检索每个资产的最新数据(源):


SELECT * FROM data d1

JOIN (

  SELECT max(data_timestamp) as newest, asset_id FROM data

  GROUP BY asset_id

) d2

ON d1.data_timestamp = d2.newest AND d1.asset_id = d2.asset_id

WHERE d1.type_id IN (

  SELECT id FROM data_type

  WHERE name = 'ELECTRICITY_CONSUMPTION'

);

我想将此查询转换为 JPA CriteriaQuery。有没有办法这样做,或者我是否需要在特定实体上使用 @SubSelect 注释?


阿晨1998
浏览 391回答 2
2回答

开满天机

我最终使用了一个带有 SubSelect 的数据库视图。我已将我的 DataEntity 拆分为 2 个实体:一个操作数据另一个视图,仅用于检索最新数据基类:@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。仅在WHEREorHAVING子句中。Eclipse Link,从 2.4 开始,支持FROM子句的子查询。由于每个 Criteria 都转换为 JPQL,因此不可能使用 Criteria 来做您想做的事。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java