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();