使用 Querydsl 和 Spring 启动的 GroupBy 查询
GroupBy query with Querydsl and Spring Boot
我有两个实体,一个是Client
,另一个是Transactions
,它们分别链接@OneToMany
。
我想使用 Querydsl 创建一个查询,该查询将根据客户的交易次数过滤我的客户。基本上我想要这个 SQL 查询
SELECT * FROM client WHERE id IN (SELECT client_id
FROM (SELECT client_id, count(client_id) as 'count' from transaction group by client_id) as t
where t.count >= 10)
在 Querydsl 中完成。问题是我想 return 一个 BooleanExpression
以便我可以进一步聚合查询,即 AND
它或 OR
它与其他查询。
Querydsl 实体分别为 QClient
和 QTransaction
。
这是我当前的代码,
QClient client = QClient.client1;
QTransaction transaction = QTransaction.transaction;
var count = Expressions.numberPath(Long.class, "count");
var subquery = JPAExpressions.select(transaction.client.id, transaction.client.id.count().as(count))
.from(transaction).groupBy(transaction.client.id).where(count.gt(depositCount)).select(transaction.client.id);
return client.id.in(subquery);
在这种形式下不起作用。
这个怎么样?
请注意,这是我在 https://github.com/gtiwari333/spring-boot-web-application-seed
的测试项目的上下文。但是您可以轻松地将相同的应用到您的表格中。
public void doQuery() {
QArticle qArticle = QArticle.article;
QUser user = QUser.user;
var subquery1 = JPAExpressions
.select(qArticle.createdByUser.id)
.from(qArticle)
.groupBy(qArticle.createdByUser.id)
.having(qArticle.id.count().gt(5));
BooleanExpression exp = user.id.in(subquery1);
BooleanExpression exp2 = qArticle.title.length().lt(15);
List<Article> ar = from(qArticle)
.join(user).on(qArticle.createdByUser.id.eq(user.id))
.select(qArticle)
.where(exp.and(exp2))
.fetch();
System.out.println(ar);
}
此外,您的查询可以简化。
SELECT * FROM client WHERE id IN
( SELECT client_id FROM
(SELECT client_id, count(client_id) as 'count' from ransaction group by client_id)
as t where t.count >= 10)
至:
SELECT * FROM client
WHERE id IN ( SELECT client_id
FROM
TRANSACTION
GROUP BY
client_id
HAVING
count(client_id)> 10)
我有两个实体,一个是Client
,另一个是Transactions
,它们分别链接@OneToMany
。
我想使用 Querydsl 创建一个查询,该查询将根据客户的交易次数过滤我的客户。基本上我想要这个 SQL 查询
SELECT * FROM client WHERE id IN (SELECT client_id
FROM (SELECT client_id, count(client_id) as 'count' from transaction group by client_id) as t
where t.count >= 10)
在 Querydsl 中完成。问题是我想 return 一个 BooleanExpression
以便我可以进一步聚合查询,即 AND
它或 OR
它与其他查询。
Querydsl 实体分别为 QClient
和 QTransaction
。
这是我当前的代码,
QClient client = QClient.client1;
QTransaction transaction = QTransaction.transaction;
var count = Expressions.numberPath(Long.class, "count");
var subquery = JPAExpressions.select(transaction.client.id, transaction.client.id.count().as(count))
.from(transaction).groupBy(transaction.client.id).where(count.gt(depositCount)).select(transaction.client.id);
return client.id.in(subquery);
在这种形式下不起作用。
这个怎么样?
请注意,这是我在 https://github.com/gtiwari333/spring-boot-web-application-seed
的测试项目的上下文。但是您可以轻松地将相同的应用到您的表格中。
public void doQuery() {
QArticle qArticle = QArticle.article;
QUser user = QUser.user;
var subquery1 = JPAExpressions
.select(qArticle.createdByUser.id)
.from(qArticle)
.groupBy(qArticle.createdByUser.id)
.having(qArticle.id.count().gt(5));
BooleanExpression exp = user.id.in(subquery1);
BooleanExpression exp2 = qArticle.title.length().lt(15);
List<Article> ar = from(qArticle)
.join(user).on(qArticle.createdByUser.id.eq(user.id))
.select(qArticle)
.where(exp.and(exp2))
.fetch();
System.out.println(ar);
}
此外,您的查询可以简化。
SELECT * FROM client WHERE id IN
( SELECT client_id FROM
(SELECT client_id, count(client_id) as 'count' from ransaction group by client_id)
as t where t.count >= 10)
至:
SELECT * FROM client
WHERE id IN ( SELECT client_id
FROM
TRANSACTION
GROUP BY
client_id
HAVING
count(client_id)> 10)