Hibernate Spring JPA条件查询分组依据与to_char函数

Hibernate Spring JPA条件查询分组依据与to_char函数,hibernate,group-by,spring-data-jpa,hibernate-criteria,Hibernate,Group By,Spring Data Jpa,Hibernate Criteria,我试着按天/月/年分组 Expression<String> expression = criteriaBuilder.function( "to_char", String.class, root.get("reqDate"), criteriaBuilder.parameter(String.class, "dateSegment")); query.multisel

我试着按天/月/年分组

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();
有约束力

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]
为什么它作为两个不同的参数绑定

日志


通过使查询看起来像

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

您的错误是使用
criteriaBuilder.parameter(String.class,“dateSegment”)
作为日期时间格式化程序。您应该使用
cb.literal(“MM-YYYY”)
来代替它,然后所有这些都应该按预期工作。 因此,正确的代码如下所示:

Expression<String> expression = criteriaBuilder.function(
                            "to_char", String.class, root.get("reqDate"),
                            criteriaBuilder.literal("MM-YYYY"));

query.multiselect(
                criteriaBuilder.count(root).alias(FIELD_COUNT), expression.alias("reqDate"))
               .groupBy(expression);
entityManager.createQuery(query)
        .getResultList();
Expression=criteriaBuilder.function(
“to_char”,String.class,root.get(“reqDate”),
criteriaBuilder.literal(“MM-YYYY”);
query.multiselect(
criteriaBuilder.count(root).alias(FIELD_count),expression.alias(“reqDate”))
.groupBy(表达式);
entityManager.createQuery(查询)
.getResultList();

请粘贴java堆栈跟踪错误消息
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
Expression<String> expression = criteriaBuilder.function(
                            "to_char", String.class, root.get("reqDate"),
                            criteriaBuilder.literal("MM-YYYY"));

query.multiselect(
                criteriaBuilder.count(root).alias(FIELD_COUNT), expression.alias("reqDate"))
               .groupBy(expression);
entityManager.createQuery(query)
        .getResultList();