某些SQL函数在HQL中不起作用

时间:2014-05-28 20:40:23

标签: java sql sql-server hibernate postgresql

以下sql在PostgreSql上以及在Hibernate中的HQL中直接运行时有效:

sql = "update Address set city = upper(city)"

HQL: session.createQuery(sql).executeUpdate()

但是,当我尝试使用sql函数left(String,number)时如下:

sql = "update Address set city = left(city,7)"

它直接在PostgreSql上运行,但在Hibernate中抛出此异常:

org.hibernate.hql.ast.QuerySyntaxException: unexpected token: left near line 1

我将方言正确设置为:

props.put("hibernate.dialect", PostgreSQLDialect.class.getName());

如何让HQL的行为与SQL相同?

为什么"鞋帮"功能工作,但不是"左"功能

1 个答案:

答案 0 :(得分:1)

HQL确实支持upper函数,但它不支持left函数。您必须使用带有三个参数的等效子字符串函数:

"update Address set city = substring(city,1,7)"

您还可以通过以下方式创建查询来计算Java级别的子字符串:

"update Address set city = :city"

然后你可以这样运行查询:

session.createQuery(sql).setParameter("city", newCity).executeUpdate();

city是这样创建的子字符串:

  newCity = city.substring(1,7)

使用creativeNativeQuery函数而不是createQuery,更简单(更少Hibernateish)的方法是,您不必以这种方式进行任何子字符串计算。这样就可以像使用PostgreSQL语法一样运行该方法。