使用to_char函数的Spring JPA条件查询组

问题描述 投票:0回答:1

我正在尝试按日/月/年分组

Expression<String> expression = criteriaBuilder.function(
                            "to_char", String.class, root.get("reqDate"),
                            criteriaBuilder.parameter(String.class, "dateSegment"));

query.multiselect(
                criteriaBuilder.count(root).alias(FIELD_COUNT), expression.alias("reqDate"))
               .groupBy(expression);
entityManager.createQuery(query)
        .setParameter("dateSegment","MM-YYYY")
        .getResultList();

但这引发了一个错误,即选择字段必须出现在group by中,这已经是我检查了生成的sql,它在db控制台中有效。但不是使用JPA,我做错了什么?

生成的SQL

select 
  count(shipment0_.shipment_pk_id) as col_0_0_, 
  to_char(
    shipment0_.requested_delivery_date_time, 
    ?
  ) as col_2_0_ 
from 
  shipment shipment0_ 
group by 
  to_char(
    shipment0_.requested_delivery_date_time, 
    ?
  )

具有约束力

2019-10-28 09:20:05,891 TRACE [0.0-8080-exec-6 Wcl5M33fEZTS5iF Wcl5M33fEZTS5iF] - o.h.type.descriptor.sql.BasicBinder      : binding parameter [6] as [VARCHAR] - [MM-YYYY]
2019-10-28 09:20:05,891 TRACE [0.0-8080-exec-6 Wcl5M33fEZTS5iF Wcl5M33fEZTS5iF] - o.h.type.descriptor.sql.BasicBinder      : binding parameter [10] as [VARCHAR] - [MM-YYYY]

为什么将其绑定为两个不同的参数?

log

org.postgresql.util.PSQLException: ERROR: column "shipment0_.requested_delivery_date_time" must appear in the GROUP BY clause or be used in an aggregate function
  Position: 383
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440) ~[postgresql-42.2.5.jar:42.2.5]
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183) ~[postgresql-42.2.5.jar:42.2.5]
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308) ~[postgresql-42.2.5.jar:42.2.5]
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441) ~[postgresql-42.2.5.jar:42.2.5]
hibernate group-by spring-data-jpa hibernate-criteria
1个回答
0
投票

通过使查询看起来像来做到这一点

select 
  count(shipment0_.shipment_pk_id) as col_0_0_, 
  to_char(
    shipment0_.requested_delivery_date_time, 
    ?
  ) as col_2_0_ 
from 
  shipment shipment0_ 
group by 
  2
© www.soinside.com 2019 - 2024. All rights reserved.