Java 一些SQL函数没有';我不能在HQL中工作
当我直接在PostgreSql上以及在Hibernate的HQL中运行以下sql时,它是有效的:Java 一些SQL函数没有';我不能在HQL中工作,java,sql,sql-server,hibernate,postgresql,Java,Sql,Sql Server,Hibernate,Postgresql,当我直接在PostgreSql上以及在Hibernate的HQL中运行以下sql时,它是有效的: sql = "update Address set city = upper(city)" HQL: session.createQuery(sql).executeUpdate() org.hibernate.hql.ast.QuerySyntaxException: unexpected token: left near line 1 但是,当我尝试使用sql函数left(String,n
sql = "update Address set city = upper(city)"
HQL: session.createQuery(sql).executeUpdate()
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: left near line 1
但是,当我尝试使用sql函数left(String,number)时,如下所示:
sql = "update Address set city = left(city,7)"
它直接在PostgreSql上运行良好,但在Hibernate中引发此异常:
sql = "update Address set city = upper(city)"
HQL: session.createQuery(sql).executeUpdate()
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: left near line 1
我已将方言正确设置为:
props.put("hibernate.dialect", PostgreSQLDialect.class.getName());
如何使HQL的行为与SQL相同
为什么“upper”函数工作,而“left”函数不工作?HQL支持upper函数,但不支持left函数。必须使用具有三个参数的等效子字符串函数:
"update Address set city = substring(city,1,7)"
您还可以通过以下方式创建查询,从Java级别计算子字符串:
"update Address set city = :city"
session.createQuery(sql).setParameter("city", newCity).executeUpdate();
然后可以通过以下方式运行查询:
"update Address set city = :city"
session.createQuery(sql).setParameter("city", newCity).executeUpdate();
其中city是这样创建的子字符串:
newCity = city.substring(1,7)
更简单(也更少休眠)的方法是使用creativeNativeQuery函数而不是createQuery,这样就不必进行任何子字符串计算。这就像使用PostgreSQL语法一样运行该方法。我不知道这与sql server(以及它的标记)有什么关系(当然,我可能遗漏了一些东西)