java - Spring Data JPA 与 QueryDSL、聚合函数的计数问题

标签 java spring spring-data spring-data-jpa querydsl

我正在将 Spring Data JPA 与 QueryDSL 结合使用,并尝试在 where 条件下使用 Sum 函数,因为我正在使用分页,所以我必须先进行计数。 所以我有如下java代码:-

NumberPath<Double> path = entityPath.getNumber("qty", Double.class);
BooleanExpression exp = path.sum().loe(120);        
JPQLQuery countQuery = from(stock).where(exp);
long count = countQuery.count();

它的创建查询如下:-

select count(stock0_.stock_id) as col_0_0_ from stock stock0_ 
where sum(stock0_.qty)>=120;

我收到错误代码:1111。组功能使用无效

上述查询在 SQL 中也不起作用,因为 sum 函数不能与 where 条件中的 count 一起使用。当我必须先计数然后获取真实数据时,我不知道如何处理这样的问题。 有人可以帮我解决一下处理此类问题的 JPA 方法吗?

请不要建议使用 @Query 注释,因为我无法使用它。由于动态过滤要求。

最佳答案

您正在使用聚合函数(sum)。那么你需要having()而不是where()

这个例子非常大。您只需要关心分页和元素。

如果您有不同的谓词pageRequest对象。

页面请求示例:

pageRequest = new PageRequest(
                MI_PAGE, 
                LIMIT, 
                Sort.Direction.valueOf( ASC ), 
                ORDER_FIELD);

EntityQ 表示 QueryDSL 生成的元实体。

查询示例:

new JPAQuery(em).from(entityQ).where( entityQ.id.in(

        new JPASubQuery()
        .from(entity2Q).innerJoin(entity2Q.objEntityQ, entityQ)
            .where(ENTITY, PREDICATE)                           
            .groupBy(entity2Q.objEntityQ.id)
            .having( Wildcard.count.goe(SIZE) )                 
        .list(entity2Q.objEntityQ.id)

    ))
    .offset(pageRequest.getOffset() )
    .limit( pageRequest.getPageSize() ) 
    .orderBy(ORDERS).list(entityQ); 

编辑 2 更具体地说明您的示例:

我的自定义存储库中通常有一个持久性上下文:

@PersistenceContext
EntityManager em

然后,您可以创建一个简单的 JPAQuery:

new JPAQuery(em)
.from(YOUR_STOCK_QUERYDSL_ENTITY)
.groupBy(YOUR_STOCK_QUERYDSL_ENTITY.field_to_sum)
.having(YOUR_STOCK_QUERYDSL_ENTITY.field_to_sum.sum().as("alias")
.goe(100));

关于java - Spring Data JPA 与 QueryDSL、聚合函数的计数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38973654/

相关文章:

java - 运行时识别模块

java - 使用广度优先搜索从图中生成树?

java - Spring AOP代理使用

java - JPA - 通过对象集合中的多个属性查找

java - 如何将mat(OpenCV)转换为图像(JavaFX)?

java - 控制台输入错误 java.lang.NullPointerException

Spring Batch-如何在处理器中同时处理多条记录?

java - org.springframework.dao.CannotAcquireLockException

java - "No qualifying bean of type"用于 Spring Boot 中的 JPA 存储库

java - 在循环内保存到数据库