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

带有QueryDSL的Spring数据JPA,带有聚合函数的计数问题

荣沈义
2023-03-14

我正在使用查询DSL的Spring数据JPA,并试图在条件中使用求和函数,因为我正在使用分页,所以我必须首先获得计数。所以我有如下的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函数不能与count-in-where条件一起使用。当我必须先进行计数,然后再获取真实数据时,我不知道如何处理这样的问题。有人能帮我解决这个问题的JPA方法吗。

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

共有1个答案

巫马劲
2023-03-14

您正在使用聚合函数(sum)。那么您需要使用()代替where()

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

如果您有不同的谓词和页面请求对象。

页面请求示例:

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));
 类似资料:
  • 如何使用规范编写下面查询 当我们使用Specification时,即使在multiselect中提到了count(),也没有选择count()。 为什么JPA中的multiselect方法不起作用

  • 问题内容: 我使用Vlad Mihalcea的库来将SQL数组(在我的情况下为Postgresql)映射到JPA。然后,假设我有一个实体,例如。 适当的SQL是: 使用QueryDSL,我想获取包含所有给定标签的行。原始SQL可能是: (摘自:https : //www.postgresql.org/docs/9.1/static/functions- array.html ) 可以用QueryD

  • 我目前正在从事一个项目,在该项目中,我给出了一个实体,该实体具有一个集合,即订单,因此客户和订单之间存在一种单一关系。假设我想选择具有相应数量的订单实体(在SQL中称为计数)的客户集合的子集:Spring Data JPA提供的查询方法是否已经有了默认实现,以避免使用JPQL编写自定义查询,该查询在一个SQL查询中而不是在n 1个查询中获取客户订单的数量其中n是客户数量?或者可以在某种瞬态字段(例

  • 问题内容: 我正在尝试对某些条件过滤后的值进行汇总。我正在使用spring数据的ElasticSearchTemplate.query()方法也执行查询并在结果提取器中获取结果。我正确地找到了匹配(即应用了过滤器,并且仅检索了与这些值匹配的文档。)。但是,汇总是在所有文档上执行的。我认为汇总应仅应用于过滤后的值。以下是我正在使用的代码: 为了进一步调试问题,我编写了代码来执行查询,而不是使用spr

  • 我使用本教程使用REST访问JPA数据,创建了一个简单的RESTful Web服务,用于访问数据库中的一些数据。它工作得很好。我喜欢它有多简单,我或多或少了解它的工作原理。 但是,有人要求我添加一些自定义日志记录。每当Web服务被调用日志时,都会生成“Start-time”,并在服务返回之前生成另一个日志“End-time”。有没有办法在不破坏我的包含@Query anotation的方法的情况下

  • 我在应用程序中使用Querydsl来大大改进查询数据库的代码。但是,我有一个来自外部服务的JPA谓词(javax.persistence.criteria.Predicate)。我想混合使用Querydsl和外部谓词创建的查询。例如: 另一个解决方案是将Querydsl谓词转换为JPA谓词: 有可能吗?如果是,我如何做到这一点?如果没有,是否有其他混合谓词的解决方案(比如将两者转换为SQL字符串并