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
CriteriaBuilder JPA:子查询/groupby/maxresult中的Multiselect_Jpa_Persistence_Criteria Api - Fatal编程技术网

CriteriaBuilder JPA:子查询/groupby/maxresult中的Multiselect

CriteriaBuilder JPA:子查询/groupby/maxresult中的Multiselect,jpa,persistence,criteria-api,Jpa,Persistence,Criteria Api,目前,我正在为客户列表开发一个“过滤器”功能 我有下面的子查询,我不确定是否有办法用CriteriaBuilder构建它。它也可以在没有multiselectb.date、的情况下工作,但我需要分组依据、排序依据和限制来选择最小值。结果应该是一个数字 SELECT (COALESCE(SUM(b.account1),0) + COALESCE(SUM(b.account2),0) + COALESCE(SUM(b.deposits),0)) AS SUM FROM customer_balanc

目前,我正在为客户列表开发一个“过滤器”功能

我有下面的子查询,我不确定是否有办法用CriteriaBuilder构建它。它也可以在没有multiselect
b.date、
的情况下工作,但我需要
分组依据
排序依据
限制
来选择最小值。结果应该是一个数字

SELECT (COALESCE(SUM(b.account1),0) + COALESCE(SUM(b.account2),0) + COALESCE(SUM(b.deposits),0)) AS SUM FROM customer_balance b WHERE b.client_nr = '123455'
GROUP BY b.date
ORDER BY SUM
LIMIT 1
e、 g.客户余额表

"client_nr","date","account1","account2","deposits"
"1234567","2018-02-28",204600.0,82500.0,21120.0
更新: 这是我目前的代码,但是

Subquery<BigDecimal> CustomerBalanceSubQuery = CustomerQuery.subquery(BigDecimal.class);
Root<CustomerBalance> CustomerBalance = CustomerBalanceSubQuery.from(CustomerBalance.class);

Expression<BigDecimal> currentAccount = criteriaBuilder.sum(CustomerBalance.get("currentAccount"));
Expression<BigDecimal> overnightDeposits = criteriaBuilder.sum(CustomerBalance.get("overnightDeposits"));
Expression<BigDecimal> termDeposits = criteriaBuilder.sum(CustomerBalance.get("termDeposits"));

CustomerBalanceSubQuery.select(criteriaBuilder.sum(termDeposits, criteriaBuilder.sum(overnightDeposits, currentAccount)));
Predicate predicate = criteriaBuilder.equal(CustomerBalance.get("id").get("ClientNr"), Customer.get("ClientNr"));
CustomerBalanceSubQuery.where(predicate);

// adding to main-query
queryPredicateList.add(criteriaBuilder.and(criteriaBuilder.greaterThan(CustomerBalanceSubQuery, BigDecimal.valueOf(liquidity))));
Subquery CustomerBalanceSubQuery=CustomerQuery.Subquery(BigDecimal.class);
Root CustomerBalance=CustomerBalanceSubQuery.from(CustomerBalance.class);
表达式currentAccount=criteriaBuilder.sum(CustomerBalance.get(“currentAccount”);
表达式overnightDeposits=criteriaBuilder.sum(CustomerBalance.get(“overnightDeposits”);
表达式termposits=criteriaBuilder.sum(CustomerBalance.get(“termposits”);
选择(criteriaBuilder.sum(termDeposits,criteriaBuilder.sum(overnightDeposits,currentAccount));
谓词谓词=criteriaBuilder.equal(CustomerBalance.get(“id”).get(“ClientNr”)、Customer.get(“ClientNr”);
CustomerBalanceSubQuery.where(谓词);
//添加到主查询
添加(criteriaBuilder.and(criteriaBuilder.greaterThan(CustomerBalanceSubQuery,BigDecimal.valueOf(liquidity)));
  • 如何为我的子查询添加
    orderBy
  • 如何设置
    maxResult
谢谢!
B

在与一些同事交谈后,我将查询重构为:

从客户余额b中选择最小值(合并(b.活期存款,0)+合并(b.隔夜存款,0)+合并(b.定期存款,0)),其中b.客户编号='123456'

而代码

Subquery<BigDecimal> customerBalanceSubQuery = customerQuery.subquery(BigDecimal.class);
Root<CustomerBalance> customerBalance = customerBalanceSubQuery.from(CustomerBalance.class);

Expression<BigDecimal> currentAccount = customerBalance.get("currentAccount");
Expression<BigDecimal> overnightDeposits = customerBalance.get("overnightDeposits");
Expression<BigDecimal> termDeposits = customerBalance.get("termDeposits");

customerBalanceSubQuery.select(criteriaBuilder.min(criteriaBuilder.sum(termDeposits, criteriaBuilder.sum(overnightDeposits, currentAccount))));
Predicate predicate = criteriaBuilder.equal(customerBalance.get("id").get("clientNr"), customer.get("clientNr"));
customerBalanceSubQuery.where(predicate);

queryPredicateList.add(criteriaBuilder.and(criteriaBuilder.greaterThan(CustomerBalanceSubQuery, BigDecimal.valueOf(liquidity))));
Subquery customerBalanceSubQuery=customerQuery.Subquery(BigDecimal.class);
Root customerBalance=customerBalanceSubQuery.from(customerBalance.class);
表达式currentAccount=customerBalance.get(“currentAccount”);
表达式overnightDeposits=customerBalance.get(“overnightDeposits”);
表达式termDeposits=customerBalance.get(“termDeposits”);
选择(criteriaBuilder.min(criteriaBuilder.sum(termDeposits,criteriaBuilder.sum(OvernighDeposits,currentAccount)));
谓词谓词=criteriaBuilder.equal(customerBalance.get(“id”).get(“clientNr”)、customer.get(“clientNr”);
customerBalanceSubQuery.where(谓词);
添加(criteriaBuilder.and(criteriaBuilder.greaterThan(CustomerBalanceSubQuery,BigDecimal.valueOf(liquidity)));
不管怎样,从最初的问题中看到这个查询是很有趣的。
除了上面提到的@BillyFrost之外,我不确定是否每个sql查询都可以使用Criteria API构建。

在与一些同事交谈后,我将查询重构为:

从客户余额b中选择最小值(合并(b.活期存款,0)+合并(b.隔夜存款,0)+合并(b.定期存款,0)),其中b.客户编号='123456'

而代码

Subquery<BigDecimal> customerBalanceSubQuery = customerQuery.subquery(BigDecimal.class);
Root<CustomerBalance> customerBalance = customerBalanceSubQuery.from(CustomerBalance.class);

Expression<BigDecimal> currentAccount = customerBalance.get("currentAccount");
Expression<BigDecimal> overnightDeposits = customerBalance.get("overnightDeposits");
Expression<BigDecimal> termDeposits = customerBalance.get("termDeposits");

customerBalanceSubQuery.select(criteriaBuilder.min(criteriaBuilder.sum(termDeposits, criteriaBuilder.sum(overnightDeposits, currentAccount))));
Predicate predicate = criteriaBuilder.equal(customerBalance.get("id").get("clientNr"), customer.get("clientNr"));
customerBalanceSubQuery.where(predicate);

queryPredicateList.add(criteriaBuilder.and(criteriaBuilder.greaterThan(CustomerBalanceSubQuery, BigDecimal.valueOf(liquidity))));
Subquery customerBalanceSubQuery=customerQuery.Subquery(BigDecimal.class);
Root customerBalance=customerBalanceSubQuery.from(customerBalance.class);
表达式currentAccount=customerBalance.get(“currentAccount”);
表达式overnightDeposits=customerBalance.get(“overnightDeposits”);
表达式termDeposits=customerBalance.get(“termDeposits”);
选择(criteriaBuilder.min(criteriaBuilder.sum(termDeposits,criteriaBuilder.sum(OvernighDeposits,currentAccount)));
谓词谓词=criteriaBuilder.equal(customerBalance.get(“id”).get(“clientNr”)、customer.get(“clientNr”);
customerBalanceSubQuery.where(谓词);
添加(criteriaBuilder.and(criteriaBuilder.greaterThan(CustomerBalanceSubQuery,BigDecimal.valueOf(liquidity)));
不管怎样,从最初的问题中看到这个查询是很有趣的。
除了上面提到的@BillyFrost之外,我不确定是否每个sql查询都可以使用Criteria API构建。

当您已经有一个工作查询时,为什么要使用Criteria API?所有JPQL查询都应该可以使用Criteria进行构建。首先,你应该发布你尝试过的内容,以及你有问题的部分。显然,上面的不是JPQL,所以发布JPQL@SimonMartinelli我的查询是动态的。根据查询参数,我必须查询不同的表,这实际上是我的挑战。我需要一个子查询来获取不同表中按日期分组的三个总和的最小值。@BillyFrost你说得对,我更新了这个问题。你为什么认为需要子查询?我将尝试使用一个包含求和结果的表达式mySum=criteriaBuilder.sum(…)进行简单查询。然后我将对这个表达式
cq.orderBy(criteriaBuilder.desc(mySum))
应用排序,最后对结果查询应用
setMaxResults()
方法当您已经有一个工作查询时为什么要使用Criteria API?所有JPQL查询都应该可以使用Criteria构建。首先,你应该发布你尝试过的内容,以及你有问题的部分。显然,上面的不是JPQL,所以发布JPQL@SimonMartinelli我的查询是动态的。根据查询参数,我必须查询不同的表,这实际上是我的挑战。我需要一个子查询来获取不同表中按日期分组的三个总和的最小值。@BillyFrost你说得对,我更新了这个问题。你为什么认为需要子查询?我将尝试使用一个包含求和结果的表达式mySum=criteriaBuilder.sum(…)进行简单查询。然后我将对这个表达式
cq.orderBy(criteriaBuilder.desc(mySum))
应用排序,最后对结果查询应用
setMaxResults()
方法