JPA 2,没有实体映射的连接条件查询

Posted

技术标签:

【中文标题】JPA 2,没有实体映射的连接条件查询【英文标题】:JPA 2, join criteria query without entity mapping 【发布时间】:2020-07-10 09:35:12 【问题描述】:

我有以下表格:

客户

订单

  @Entity
  public class Customer 

      String id;

  

  @Entity
  public class Order 

      String id;
      String customerId;

  

我没有用在它们之间建立实体的映射;但是我需要一个查询来连接这两个表:

    final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
    final CriteriaQuery<Customer> criteriaQuery = criteriaBuilder.createQuery(Customer.class);
    final Root<Customer> root = criteriaQuery.from(Customer.class);
    final Join<Order, Customer> joinOrder = root.join(Order_.customerId.getName()); // doesn't work

    final TypedQuery<Customer> queryData = entityManager.createQuery(
            criteriaQuery
                    .where(
                            criteriaBuilder.lessThan(root.get(Customer_.creationDate), date)
                            // should add a predicate with order properties
                    )
    );


    return queryData.getResultList();

是否可以使用 JPA 2 执行上述操作?

【问题讨论】:

完全正确。 Customer 和 Order 与 order.customerId 绑定,我想添加谓词 Order 实体 【参考方案1】: 您可以使用子查询
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Customer> customerQuery = 
                                      cb.createQuery(Customer.class);
    Root<Customer> customerRoot = customerQuery.from(Customer.class);

    Subquery<Order> subQuery = customerQuery.subquery(Order.class);
    Root<Order> orderRoot = subQuery.from(Order.class);

    //Replace this with the restriction you want to apply to order
    Predicate predicate= orderRoot.get("xxxxx").in(xxx, xxx);

    subQuery.select(orderRoot.get("customerId")).where(predicate);

    customerQuery.select(customerRoot).where(customerRoot.get("id").in(subQuery));
    em.createQuery(issueQuery).getResultList();

【讨论】:

以上是关于JPA 2,没有实体映射的连接条件查询的主要内容,如果未能解决你的问题,请参考以下文章

具有 INNER JOIN 条件的 JPA 命名查询失败

Spring Data 系列学习Spring Data JPA 自定义查询,分页,排序,条件查询

Spring Data 系列学习Spring Data JPA 自定义查询,分页,排序,条件查询

休眠条件查询到 JPA 条件查询

Spring Data JPA方法定义规范

休眠条件:在没有映射关联的情况下加入表