【问题标题】:JPA2 CreateQuery SQL Server DialectJPA2 CreateQuery SQL Server 方言
【发布时间】:2014-01-23 22:44:09
【问题描述】:

java.persistence.Query 中的函数 CreateQuery(string) 返回的查询与我的请求不同。

我的函数输入字符串是:

来自底层证券 where (SUBSTRING(ticker, (charindex('.', ticker) + 1), (len(ticker) - charindex('.', ticker))) 以 (:exchanges) 顺序排列 股票代码

当我在 Query 上调用 getResultList() 时,我在日志中看到以下 sql:

休眠:选择底层0_.id 作为id63_,底层0_.updated_date 作为updated2_63_,底层0_.updated_user 作为updated3_63_, 底层0_.version 作为版本63_,底层0_.adr 作为adr63_, 底层0_.desk 作为desk63_,底层0_.enabled 作为启用63_, 底层0_.forward_start_enabled 为forward8_63_, 底层0_.ticker 为ticker63_,底层0_.vol_shift_type 为 vol10_63_ 来自底层证券 底层0_ 其中 (substring(underlying0_.ticker, charindex('.', underlying0_.ticker)+1) 在 (?)) 中按底层 0_.ticker 排序

此查询不是有效的 SQL Server 2008 查询,正如预期的那样,我收到了一个错误:

SQL 错误:174,SQLState:S0001 子字符串函数需要 3 个参数。

有人知道这里发生了什么吗?

仅供参考,我尝试了以下两种方言 1) org.hibernate.dialect.SQLServer2008Dialect 和 2) org.hibernate.dialect.SQLServer2008Dialect

【问题讨论】:

  • 你能试试 LENGTH(ticker) 而不是 len(ticker)。
  • 感谢 Gayathri 的回复,我尝试将 LEN 替换为 LENGTH,但是,我得到了相同的结果,即我的输入中的 3 个 args 被转换为 2 个 args,如日志条目中所示。
  • 我认为您缺少右括号。
  • 再次感谢 Gayathri,非常感谢!那也不是问题。我发现了问题,将在下面提供答案。谢谢!
  • 很高兴你找到它!我使用 Locate() 而不是 charindex 在 Oracle 上运行了相同的查询,效果很好。

标签: java spring hibernate jpa-2.0 substring


【解决方案1】:

问题在于函数 charindex。它在方言中不可用,因此会导致映射不正确。将其更改为 HQL 函数“定位”(保持 args 不变)解决了该问题。我的查询现在可以在 SQL Server 2008 中使用:

...where (substring(underlying0_.ticker, charindex('.', 底层0_.ticker)+1, len(底层0_.ticker)-charindex('.', (?)) 中的基础 0_.ticker))...

【讨论】:

    【解决方案2】:

    错误清楚地提到SUBSTRING() 函数需要 3 个您传递的参数 2。因此错误在您的查询中。

    阅读SUBSTRING()函数

    【讨论】:

    • 感谢您的回复。我了解问题是缺少 1 个 arg。那不是我的问题。我在询问将字符串转换为数据库特定查询的方言(在本例中为 SQL Server 2008)。我的输入字符串显然有 3 个参数,然后它被转换为有 2 个参数。无论如何,谢谢。
    猜你喜欢
    • 2016-06-12
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    相关资源
    最近更新 更多