【问题标题】:Hibernate criteria implementation for this entity model (subquery, self-join)此实体模型的休眠条件实现(子查询、自联接)
【发布时间】:2014-07-23 19:16:08
【问题描述】:

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

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

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

@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”

我正在尝试让 Criteria API 实现:

获取每个不同存储库的最新(按访问时间)AuditRecord?即AuditRecords 列表,每个存储库一个,其中 AuditRecord 是该存储库的最后一个 AuditRecord(在存储库有许多 AuditRecord 的情况下)。

我有 HQL 查询来执行此操作:

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

但需要改用 Criteria APi:

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

【问题讨论】:

  • 你有用于 AuditRecordEntity.class 的 hibernate.hbm.xml 文件吗?
  • @hurricane 帖子已更新。

标签: java hibernate criteria criteria-api


【解决方案1】:

我通过使用 HQL 查询的输出作为标准 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);
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    相关资源
    最近更新 更多