Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一些SQL函数没有';我不能在HQL中工作_Java_Sql_Sql Server_Hibernate_Postgresql - Fatal编程技术网

Java 一些SQL函数没有';我不能在HQL中工作

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

当我直接在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,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(以及它的标记)有什么关系(当然,我可能遗漏了一些东西)