以下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相同?
为什么"鞋帮"功能工作,但不是"左"功能
答案 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语法一样运行该方法。