java - 如何将 JPA 元组结果投影到实体中

标签 java jpa openjpa criteria-api

我有一个这样的查询

public List<Tuple> listReocurringUndroppedJobs() {

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Tuple> cq= cb.createTupleQuery();

    Root<JobEvent> event = cq.from(JobEvent.class);
    Path<JobExecution> je = event.get(JobEvent_.jobExecution);
    Path<Job> j = event.get(JobEvent_.job);

    Predicate predicate = cb.conjunction();
    Predicate p1 = cb.equal(event.get(JobEvent_.event), "ENQUEUED");
    Predicate p2 = cb.gt(cb.count(event), 1);
    predicate = cb.and(p1,p2);

    cq.multiselect(je.get(JobExecution_.id),j.get(Job_.id));
    cq.groupBy(event.get(JobEvent_.event),j.get(Job_.id),je.get(JobExecution_.id)).having(predicate);

    TypedQuery<Tuple> tq = entityManager.createQuery(cq);
    //for (Tuple t : tq.getResultList()) {
    //  Long jeid = (Long)t.get(0);
    //  Long jid = (Long)t.get(1);
    //}

    return tq.getResultList();

它返回 2 个 id、jeid 和 jid 的元组。

这两个 id 唯一标识另一个实体(假设它是实体 A 的复合 PK),因此我不想返回元组列表,而是返回 A 列表。

有什么方法可以在同一个条件查询中做到这一点吗? (当然,我知道如何获取这些ID并发出另一个查询,但我觉得必须有正确的方法将这些ID投影到另一个实体中)

最佳答案

好的,在尝试添加谓词之前,先尝试一下这个。

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Job> cq= cb.createQuery(Job.class);

Root<Job> job = cq.from(Job.class);
Join<Job,JobExecutions> jobExec = job.join("jobExecution");  <--Assuming this is the name of property
Join<JobExecutions,JobEvents > jobEve = jobExec .join("event"); <--Assuming this is the name of property

cq.select(job);
TypedQuery<Job> tq = entityManager.createQuery(cq);

如果有效,您应该能够返回 Job 对象,然后您可以从那里获取记录,考虑使用 job.fetch("jobExecution");

然后根据这个新的检索结构添加谓词cq.where

关于java - 如何将 JPA 元组结果投影到实体中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22002167/

相关文章:

java - JPA Repository 变量的方法无法从 SpringBoot Main 方法保存

java - Nullable Date 列合并问题

java - 没有 JavaEE 6 可以使用 JPA 2.0 吗?

java - 使用不带服务器名的 LDAP 从 Java (Linux) 向 Active Directory 进行身份验证

java - 如何使用 Java Swing 使用 onClick 事件运行 linux 命令?

java - 在 Google Appengine 上配置 https ://yourdomain. com

java - SAX - 无需 CDATA 即可读取 HTML 内容

sql - 无法删除或更新父行 - 使用 Hibernate 的 JPA

mysql - 如何在 Spring JpaRepository 中使用自定义 DTO 进行可分页响应

java - JPA Criteria 根据条件过滤集合