为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

阿晨1998 2021-12-30 20:11:04
我有一个使用 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 d1JOIN (  SELECT max(data_timestamp) as newest, asset_id FROM data  GROUP BY asset_id) d2ON d1.data_timestamp = d2.newest AND d1.asset_id = d2.asset_idWHERE d1.type_id IN (  SELECT id FROM data_type  WHERE name = 'ELECTRICITY_CONSUMPTION');我想将此查询转换为 JPA CriteriaQuery。有没有办法这样做,或者我是否需要在特定实体上使用 @SubSelect 注释?
查看完整描述

2 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

我最终使用了一个带有 SubSelect 的数据库视图。我已将我的 DataEntity 拆分为 2 个实体:

  1. 一个操作数据

  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 {

}


查看完整回答
反对 回复 2021-12-30
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

JPQL不支持FROM或 上的子查询JOIN。仅在WHEREorHAVING子句中。Eclipse Link,从 2.4 开始,支持FROM子句的子查询。

由于每个 Criteria 都转换为 JPQL,因此不可能使用 Criteria 来做您想做的事。


查看完整回答
反对 回复 2021-12-30
  • 2 回答
  • 0 关注
  • 389 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号