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 自定义JPA CriteriaQuery的on子句_Java_Jpa_Jpa 2.0_Criteria Api_On Clause - Fatal编程技术网

Java 自定义JPA CriteriaQuery的on子句

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

有没有办法通过添加一些表达式来进一步限制联接?我用纯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' -- <= 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