Java 自定义JPA CriteriaQuery的on子句
有没有办法通过添加一些表达式来进一步限制联接?我用纯sql编写:Java 自定义JPA CriteriaQuery的on子句,java,jpa,jpa-2.0,criteria-api,on-clause,Java,Jpa,Jpa 2.0,Criteria Api,On Clause,有没有办法通过添加一些表达式来进一步限制联接?我用纯sql编写: SELECT c.*, COUNT(i.id) invoice_count FROM customers c LEFT JOIN invoices i ON i.customer_id = c.id AND i.creation_time >= '2012-01-01' -- <= extra restriction AND i.creation_time < '2013-01-01' -- &l
SELECT c.*, COUNT(i.id) invoice_count
FROM customers c
LEFT JOIN invoices i ON i.customer_id = c.id
AND i.creation_time >= '2012-01-01' -- <= extra restriction
AND i.creation_time < '2013-01-01' -- <= extra restriction
GROUP BY c.id
我还没有找到用JPA2.0 CriteriaQuery实现这一点的方法
更新:根据要求,我的简化代码到目前为止没有额外的限制:
CriteriaQuery<CustomerAndInvoiceCount> criteriaQuery = criteriaBuilder.createQuery(CustomerAndInvoiceCount.class);
Root<Customer> customer = criteriaQuery.from(Customer.class);
ListJoin<Customer, Invoice> invoices = customer.join(Customer_.invoices, JoinType.LEFT);
criteriaQuery.select(criteriaBuilder.construct(
CustomerAndInvoiceCount.class,
customer,
criteriaBuilder.count(invoices)));
criteriaQuery.groupBy(customer);
您应该能够添加条件谓词,而不必担心它们是ON子句还是WHERE子句的一部分 你能告诉我们到目前为止你已经尝试了什么吗?我已经添加了一些Java代码。有一点不同:如果我将谓词添加到WHERE子句,如果客户没有指定日期范围的发票,我就会失去客户。选择c*,COUNTi.id客户的发票计数c左键连接i.customer上的发票i\u id=c.id,其中i.creation\u time>='2012-01-01'和i.creation\u time<'2013-01-01'按c.id分组;这不起作用,因为我想检索所有具有发票计数的客户。将谓词添加到where子句会返回至少有一张发票的客户。这里有一个链接可能会有所帮助:还可以检查此url:,它建议使用相同的,但也提供了使用JPQL的选项,例如从客户c左连接c.invoices c1和c1.creationTime>=:dateParam