使用Querydsl和Spring Boot进行GroupBy查询

问题描述

我有两个实体,一个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中完成。问题是我想返回一个BooleanExpression,以便可以进一步聚合查询,即ANDOR与其他查询合并。

Querydsl实体分别为QClientQTransaction

这是我当前的代码

    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的测试项目有关。但是您可以轻松地将它们应用于表。

参考:https://github.com/gtiwari333/spring-boot-web-application-seed/blob/master/main-app/src/main/java/gt/app/modules/article/ArticleRepositoryCustomImpl.java#L48

    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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...