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



我有一个使用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标准查询。有没有办法做到这一点,或者我需要在特定实体上使用@SubSelect注释?

感谢您阅读本文!

(UGLY(解决方案

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

  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 {
}

即使我觉得这个解决方案很难看,它也可能帮助其他人!

JPQL不支持FROMJOIN上的子查询。仅在WHEREHAVING子句中。EclipseLink从2.4开始支持FROM子句上的子查询。

由于每个Criteria都转换为JPQL,所以不可能使用Criteria来执行您想要的操作。

最新更新