此实体模型的Hibernate条件实现(子查询,自联接) [英] Hibernate criteria implementation for this entity model (subquery, self-join)

查看:121
本文介绍了此实体模型的Hibernate条件实现(子查询,自联接)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给出以下实体一对多模型:

Given the following entity one-to-many model:

一个存储库可以链接到许多AuditRecords。

One Repository can be linked to many AuditRecords.

许多AuditRecords都可以链接到相同的存储库

Many AuditRecords can all link to the same Repository

@Entity
class AuditRecordEntity {
  private AuditRepositoryEntity auditRepository;  

  @ManyToOne(cascade = CascadeType.ALL)
  @JoinColumn(name = AUDIT_REPOSITORY_DB_COLUMN_NAME, nullable = false, updatable = false)
  public AuditRepositoryEntity getAuditRepository() {
    return auditRepository;
  }
  ...
}

@Entity
class AuditRepositoryEntity {
  private List<AuditRecordEntity> auditRecords = new ArrayList<AuditRecordEntity>();

  @OneToMany(mappedBy = "auditRepository")
  public List<AuditRecordEntity> getAuditRecords() {
    return auditRecords;
  }
  ...
}

较小校正下面的ERD图,对于'repositoryId',请阅读'auditRepository'

Minor correction, in ERD diagram below, for 'repositoryId', read 'auditRepository'

我正在尝试实现Criteria API实现:

I am trying to get the Criteria API implementation to:

每个不同存储库的最新(按访问时间)AuditRecord?即审计记录列表,每个存储库一个,其中AuditRecord是该存储库的最后一个AuditRecord(如果存储库有许多AuditRecords)。

Get the latest (by accessTime) AuditRecord for each distinct Repository? I.e. a list of AuditRecords, one for each Repository, where the AuditRecord is the last AuditRecord for that Repository (in the case where a Repository has many AuditRecords).

要执行此操作的HQL查询:

I have the HQL query to do this:

select auditRecord from AuditRecordEntity auditRecord where auditRecord.accessTime = 
(select max(auditRecord2.accessTime) from AuditRecordEntity auditRecord2 where  
auditRecord2.auditRepository = auditRecord.auditRepository)

而是使用Criteria APi:

But need to use the Criteria APi instead:

CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<Object> query = builder.createQuery();
Root<AuditRecordEntity> root = query.from(AuditRecordEntity.class);
// what next?


推荐答案

我已经使用来解决这个问题HQL查询的输出作为对标准API的输入:

I have got this to work(around) by using the output from the HQL query as input to the criteria API:

final List<UUID> auditRecordIds = execute("select auditRecord from AuditRecordEntity auditRecord where auditRecord.accessTime = 
(select max(auditRecord2.accessTime) from AuditRecordEntity auditRecord2 where  
auditRecord2.auditRepository = auditRecord.auditRepository)")

Root<AuditRecordEntity> root = criteriaQuery.from(AuditRecordEntity.class);
criteriaQuery.select(root);

List<Predicate> predicates = new ArrayList<Predicate>();
predicates.add(root.get("id").in(auditRecordIds.toArray()));
entitySearchCriteria.addPredicates(predicates);
...

这篇关于此实体模型的Hibernate条件实现(子查询,自联接)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆