Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA2,无实体映射的连接条件查询_Java_Jpa_Criteriaquery - Fatal编程技术网

Java JPA2,无实体映射的连接条件查询

Java JPA2,无实体映射的连接条件查询,java,jpa,criteriaquery,Java,Jpa,Criteriaquery,我有以下表格: 顾客 命令 @Entity public class Customer { String id; } @Entity public class Order { String id; String customerId; } 我没有必要建立实体之间的映射;但是,我需要一个查询来连接这两个表: final CriteriaBuilder criteriaBuilder = entityManage

我有以下表格:

  • 顾客

  • 命令

      @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();
final-CriteriaBuilder-CriteriaBuilder=entityManager.getCriteriaBuilder();
final-CriteriaQuery-CriteriaQuery=criteriaBuilder.createQuery(Customer.class);
最终根=criteriaQuery.from(Customer.class);
final-Join-joinOrder=root.Join(Order\uu.customerId.getName());//不起作用
最终类型DQuery queryData=entityManager.createQuery(
标准查询
.在哪里(
criteriaBuilder.lessThan(root.get(Customer\uu.creationDate),date)
//应添加具有顺序属性的谓词
)
);
返回queryData.getResultList();
JPA 2是否可以执行上述操作?

  • 您可以使用子查询
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery customerQuery=
cb.createQuery(Customer.class);
Root customerRoot=customerQuery.from(Customer.class);
Subquery Subquery=customerQuery.Subquery(Order.class);
Root orderRoot=subQuery.from(Order.class);
//将此替换为要应用于订单的限制
谓词=orderRoot.get(“xxxxx”).in(xxx,xxx);
select(orderRoot.get(“customerId”)).where(谓词);
选择(customerRoot).where(customerRoot.get(“id”).in(子查询));
em.createQuery(issueQuery).getResultList();

完全正确。Customer和Order与Order.customerId绑定,我想在Order实体上添加谓词
    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();