【问题标题】:Some SQL functions don't work in HQL某些 SQL 函数在 HQL 中不起作用
【发布时间】:2014-05-28 20:40:23
【问题描述】:

当我直接在 PostgreSql 以及 Hibernate 中的 HQL 上运行以下 sql 时,它是有效的:

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 相同?

为什么“上”功能有效,“左”功能无效?

【问题讨论】:

  • 我没有看到这与 sql-server(以及它的标签)有什么关系(但当然我可能会遗漏一些东西)

标签: java sql sql-server hibernate postgresql


【解决方案1】:

HQL 支持上功能,但不支持左功能。您必须使用带有三个参数的等效子字符串函数:

"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)

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

【讨论】:

    猜你喜欢
    • 2021-04-24
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 2015-09-22
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多