猿问

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

我有一个 Location 实体表,其中包含一个String 类型的城市属性和一个Boolean 类型的活动属性。

例如,我们有两个实体,城市为“Derby”和“DERBY”。我只需要为这两个返回一个字符串条目。

以下 hql 被 Hibernate 解析为 ok:

select distinct upper(l.city) from Location l where l.active = true

Hibernate 显然无法解析以下 hql:

select count(distinct upper(l.city)) from Location l where l.active = true

Hibernate 似乎在“上层”抛出异常,在那里它看起来需要别名或标识符。

对于我们的 postgres 数据库,完全相同的 select 语句作为标准 sql 工作正常。

我还能如何从 Location 中提取大写城市属性的不同行?


jeck猫
浏览 186回答 2
2回答

POPMUISE

从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
随时随地看视频慕课网APP

相关分类

Java
我要回答