当前位置: 首页 > 知识库问答 >
问题:

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

夏振国
2023-03-14

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

我有以下子查询,我不确定是否有办法用CriteriaBuilder构建它。它也可以在没有multiselectb.date的情况下工作,...但是我需要Group Byorder ByLimit来选择最小值。结果应该是一个数字。

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

例如客户余额表

"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))));
  • 如何为我的子查询添加排序依据
  • 如何设置maxResult

谢谢!B

共有1个答案

郎同化
2023-03-14

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

SELECT min(COALESCE(b.current_account,0)COALESCE(b.overnight_deposits,0)COALESCE(b.term_deposits,0))从customer_balanceb哪里b.client_nr='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))));

不管怎样,从原始问题中查看查询会很有趣。除了提到的@BillyFrost之外,我不确定是否每个sql查询都可以用criteriaapi构建。

 类似资料:
  • 我有下面的模式, 学生(名字、姓氏、SID) 已注册(学生ID、课程ID) 课程(CID、课程名称、系) 我需要找出哪些学生上的课比课多。和位位于类别中。我有以下查询,其中列出了所有注册课程的学生以及他们注册了多少课程。 不太确定如何将这个数字与那些注册信息技术课程的人进行比较。

  • 本文向大家介绍SQL中的子查询,包括了SQL中的子查询的使用技巧和注意事项,需要的朋友参考一下 子查询是查询内的查询,即嵌套查询。它放置在查询中,其结果用于进一步评估外部查询。 在SQL中,子查询必须遵循一些规则。其中一些是- 子查询应放在括号内。 子查询可以与不同的运算符(如<,>,<=,> =,IN,BETWEEN等)一起使用。还可以使用SELECT,INSERT,DELETE,UPDATE等

  • 问题内容: 将SELECT查询放在UPDATE查询的WHERE子句中时出现错误。 我的查询是这样的: AND错误将显示如下: “无法在FROM子句中指定目标表’m’进行更新” 问题答案: 实际上,您可以通过将其包装在子查询中来更新它(从而为结果创建临时表) 或使用 JOIN

  • 问题内容: 我正在尝试用另一列分组的该列的最大值更新表中的一列。 例如,假设我们有一个名为transactions的表,其中有两列:和。无论出于何种原因,我们都希望将其设置为等于每个值的最大值。 我很沮丧并且不擅长在SQL中执行这样的操作,但是到目前为止,这是我所拥有的: 问题答案: 除了@Gordon已经指出的语法错误之外,通常最好 排除空更新 : 无需更改任何内容就无需编写新的行版本(几乎需要

  • 问题内容: 我们正在开发一个使用EJB连接到数据库的Web应用程序。 在我们的数据库模型中,我们有一个移动设备表,另一个有功能表,最后一个有手机模型映射功能值的表。模型(id_model,…)功能(id_feature,…)model_features(id_model,id_feature,值) 我们想要执行一个查询,以按匹配特征的数量对模型进行排序。就是说,我们传递了一个要匹配的功能列表(即从

  • 问题内容: 我最近才刚开始使用SQLAlchemy,但仍无法解决某些概念。 归结为基本元素,我有两个这样的表(通过Flask-SQLAlchemy): 我将如何查询用户列表及其最新帖子(不包括无帖子的用户)。如果我使用的是SQL,则可以执行以下操作: 因此,我确切地知道“期望的” SQL可以达到我想要的效果,但是不知道如何在SQLAlchemy中“正确地”表达它。 编辑:如果很重要,我使用的是SQ