【问题标题】:Hibernate: ERROR- column must appear in the GROUP BY clause or be used in an aggregate functionHibernate: ERROR- 列必须出现在 GROUP BY 子句中或在聚合函数中使用
【发布时间】:2020-10-23 01:26:55
【问题描述】:

我正在尝试将 SQL 查询更改为 CriteriaBuilder 方式并遇到此错误。

Caused by: org.postgresql.util.PSQLException: 
ERROR: column "lopcoverag0_.slot" must appear in the GROUP BY clause 
or be used in an aggregate function

SQL - 当我在 SQLWorkbench 中执行此查询时,此查询对我有效

select count(*) from (Select distinct slot from lop_coverage 
where pageFamily='Gateway' and currentStatus ='Active' 
and (lop in ("[en_US]","none")) group by creativeID) as totalcount;

JPA CriteriaBuilder

        CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
        CriteriaQuery<String> criteriaQuery = criteriaBuilder.createQuery(String.class);
        Root<LOPCoverage> root = criteriaQuery.from(LOPCoverage.class);
        criteriaQuery.select(root.get(LOPCoverage_.slot)).distinct(true);

        List<String> lopList = Arrays.asList(new String[]{"none", "[en_US]"});

        Expression<String> lopExpression = root.get(LOPCoverage_.lop);
        Predicate lopINPredicate = lopExpression.in(lopList);

        Predicate andRestriction = criteriaBuilder.and(
                criteriaBuilder.equal(root.get("pageFamily"), pageFamily),
                lopINPredicate);


        criteriaQuery.where(andRestriction).groupBy(root.get("creativeID"));

        System.out.println( session.createQuery(criteriaQuery).list());

这是从休眠日志生成的查询

Hibernate: select distinct lopcoverag0_.slot as col_0_0_ from 
lop_coverage lopcoverag0_ where lopcoverag0_.page_family=? and 
(lopcoverag0_.lop in (? , ?)) group by lopcoverag0_.creative_id

我知道我在 criteriaBuilder 中的代码有错误,有人可以告诉我问题或将我指向正确的位置

【问题讨论】:

  • 除非 creativeID 是主键,否则您显示的第一个查询也不起作用。由于您现在正在查询具有不同列的不同表,因此它可能不再是主键。
  • 是的。表不同。最初,包中的代码是使用 JDBC 和纯 SQL 字符串编写的,DB 是 mysql。现在我正在重构整个代码以使用 hibernate 和 postgresql。
  • @jjanes 我更新了查询。请检查

标签: java postgresql hibernate criteria hibernate-criteria


【解决方案1】:

选择不同的槽

这不是聚合函数,也不属于group by

要么 select distinct group, slotselect group, slot ... group by group, slot

【讨论】:

  • 刚刚检查过此查询正在使用 SQL DB:select count(*) from (Select distinct slot from lop_coverage where page_family='Consumables' and current_status ='Active' and (lop in ('en_IN','none')) group by creative_id) as totalcount。但不在 postgresql 数据库中
  • 我将此查询修改为select count(*) from (Select distinct creative_id, slot from lop_coverage where execution_date='2020-07-02' and page_family='Consumables' and current_status ='Active' and (lop in ('en_IN]','none')) group by creative_id, slot) as totalcount 它没有显示错误但插槽值重复
  • 如果您只想要不同的插槽 - 只需选择不同的插槽而不进行任何分组
  • 需要不同的插槽计数和分组。由于广告素材 ID 重复
猜你喜欢
  • 1970-01-01
  • 2012-04-21
  • 2018-05-16
  • 2013-11-05
  • 2021-06-25
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多