2 回答

TA贡献1786条经验 获得超13个赞
我最终使用了一个带有 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 {
}

TA贡献1825条经验 获得超6个赞
JPQL不支持FROM
或 上的子查询JOIN
。仅在WHERE
orHAVING
子句中。Eclipse Link,从 2.4 开始,支持FROM
子句的子查询。
由于每个 Criteria 都转换为 JPQL,因此不可能使用 Criteria 来做您想做的事。
添加回答
举报