【问题标题】:Criteria API/HQL for this entity class此实体类的标准 API/HQL
【发布时间】:2014-07-30 09:05:24
【问题描述】:

我有以下实体类:

@Entity
@Table(name = "auditrecord", uniqueConstraints = { @UniqueConstraint(columnNames = {
    "accountid", "repositoryid" }) })
public class AuditRecordEntity {
  private UUID accountId;
  private UUID repositoryId;
  private Date accessTime;

  @Column(name = "accountid", nullable = false, updatable = false)
  public UUID getAccountId() {
    return accountId;
  }

  @Column(name = "repositoryid", nullable = false, updatable = false)
  public UUID getRepositoryId() {
    return repositoryId;
  }

  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "accesstime", nullable = false, updatable = true)
  public Date getAccessTime() {
    return accessTime;
  }

  // setters for above fields
}

注意 accountId+repositoryId 的唯一性约束,一个账户只能有一个特定 repo 的审计记录,所以同一个仓库可以有多个审计记录,每个审计记录都有不同的 accountid。

我想获取每个特定 repo 的 最新/最近访问时间 AuditRecordEntitys 的列表,最好使用条件 API。

它需要插入下面的空间:

CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<Object> criteriaQuery = criteriaBuilder.createQuery();

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

// here


List<Predicate> predicates = new ArrayList<Predicate>();
// add predicates here.
entitySearchCriteria.addPredicates(predicates);

addEntityCriteria(criteriaBuilder, criteriaQuery, root, entitySearchCriteria, null, null);
return getPagedByQuery(criteriaQuery, pageSize, pageNumber);

【问题讨论】:

    标签: java hibernate hql criteria criteria-api


    【解决方案1】:

    试试这个。

    DetachedCriteria maxDateQuery = DetachedCriteria.forClass(AuditRecordEntity.class);
    ProjectionList proj = Projections.projectionList();
    proj.add(Projections.max("accessTime"));
    proj.add(Projections.groupProperty("repositoryId"));
    maxDateQuery.setProjection(proj);
    

    我不确定这是否可行,这应该会让您对如何执行此操作有所了解。

    CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
    CriteriaQuery<Object> criteriaQuery = criteriaBuilder.createQuery();
    Root<AuditRecordEntity> root = criteriaQuery.from(AuditRecordEntity.class);
    Expression<Date> accessTime = root.get("accessTime");
    criteriaQuery.select(criteriaBuilder.max(accessTime));
    criteriaQuery.groupBy(root.get("userId"));
    //other code
    

    参考Answer

    【讨论】:

    • 谢谢@AmitChotaliya,你知道如何将它融入我上面的方法吗(我已经更新了我的帖子)?谢谢
    • 谢谢@HiberKnight,很抱歉再次询问:-(但现在在调用criteriaQuery.max(...)时出现此编译错误-绑定不匹配:通用方法max(Expression ) 类型的 CriteriaBuilder 不适用于参数 (Path)。推断的类型 Object 不是有界参数 的有效替代品。有什么想法吗?
    • 尝试更新的答案,同时检查提供的参考答案。
    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2011-08-25
    • 2014-12-26
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多