Java JPA CriteriaQuery查询每个实体的最新数据
我有一个项目使用SpringBoot 1.5.9(无法更改版本) 我有以下实体: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
@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语句中执行子查询。