为了账号安全,请及时绑定邮箱和手机立即绑定

Hibernate 无法使用 upper() 解析 count()

Hibernate 无法使用 upper() 解析 count()

jeck猫 2021-07-29 21:18:40
我有一个 Location 实体表,其中包含一个String 类型的城市属性和一个Boolean 类型的活动属性。例如,我们有两个实体,城市为“Derby”和“DERBY”。我只需要为这两个返回一个字符串条目。以下 hql 被 Hibernate 解析为 ok:select distinct upper(l.city) from Location l where l.active = trueHibernate 显然无法解析以下 hql:select count(distinct upper(l.city)) from Location l where l.active = trueHibernate 似乎在“上层”抛出异常,在那里它看起来需要别名或标识符。对于我们的 postgres 数据库,完全相同的 select 语句作为标准 sql 工作正常。我还能如何从 Location 中提取大写城市属性的不同行?
查看完整描述

2 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

从JPA 2.1 规范最终版本:


Java 持久化查询语言的 BNF 语法:


aggregate_expression ::=

    {AVG | MAX | MIN | SUM} ([DISTINCT] state_field_path_expression) |

    COUNT ([DISTINCT] identification_variable | state_field_path_expression |

          single_valued_association_path_expression) |

    function_invocation

因此,UPPER()在这种情况下,您不能像这样使用JPQL.


您可以将工作sql查询与休眠本机查询一起使用,例如:


public long getCount() {

    String sql = "SELECT COUNT(DISTINCT UPPER(l.city))"

            + " FROM location_table_name l WHERE l.active = true";


    return ((BigInteger) em.createNativeQuery(sql)

            .getSingleResult())

            .longValue();

}

笔记:


如果您不区分大小写collation,以下JPQL应该简单地工作:


SELECT COUNT(DISTINCT l.city) FROM Location l WHERE l.active = true


查看完整回答
反对 回复 2021-08-04
  • 2 回答
  • 0 关注
  • 185 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信