【问题标题】:Table Field set twice in HQL only appears once in the compiled SQLHQL中设置两次的表字段在编译的SQL中只出现一次
【发布时间】:2019-12-02 05:16:15
【问题描述】:

我的HQL查询如下(Hibernate with MS SQL Server

SELECT...FROM...WHERE...

AND...

AND REVERSE(SUBSTRING(REVERSE(**ALIAS.info**),0, CHARINDEX('@', REVERSE(**ALIAS.info**)))) in (:var1_0,:var1_1)

AND...

查询编译正确。但是,当我尝试使用query.list() method 时,它失败了。失败的原因是生成的sql query如下:

select...from...where...

and...

and (reverse(substring(reverse(**namedinfos2_.info**), 0, CHARINDEX('@')) in (?))

and...

请注意,在“@”之后缺少namedinfos2_.info again。因此CHARINDEX() function 失败,正如它所期望的2 parameters。 应该是这样的:

and...

and (reverse(substring(reverse(**namedinfos2_.info**), 0, CHARINDEX('@', **namedinfos2_.info**)) in (?))

and---

知道为什么会这样吗?或者我应该怎么做才能解决这个问题?

实际查询很长。 一个例子可以是这样的:

HQL:

select LastModifiedByUser.field
from namedinfo LastModifiedByUser
where REVERSE(SUBSTRING(REVERSE(LastModifiedByUser.info),0, CHARINDEX('@', REVERSE(LastModifiedByUser.info)))) in (:var1_0,:var1_1)

Hibernate 生成的 SQL

select namedinfos2_.field
form namedinfo namedinfos2_
where (reverse(substring(reverse(namedinfos2_.info), 0, CHARINDEX('@')) in (?)) 

注意-CHARINDEX 方法中缺少的LastModifiedByUser.info 转换 (2nd parameter)。

【问题讨论】:

  • 我没有关注问题/问题,您可能需要清理代码并显示完整的查询。
  • 实际查询很长。我用一个更小的例子更新了查询。
  • 你能说出这个表达的目的是什么吗?

标签: sql-server hibernate hql


【解决方案1】:

你能删除CHARINDEX 函数吗?我无法在expressions functions 部分找到它,因此引擎可能无法正确翻译它。

另外,您可以使用native SQL,因此您可以尝试构建简单的CHARINDEX 语句并以这种方式运行。

另外,您可以尝试使用LOCATE 来代替您正在做的事情。

【讨论】:

  • 我需要之前存在的 CHARINDEX。我正在将视图转换为 HQL,并且无法更改功能。
【解决方案2】:

我已经通过制作一个自定义函数来解决这个问题

return reverse(substring(reverse(namedinfos2_.info), 0, CHARINDEX('@'))

这让它工作,只是我每次都需要调用这个函数。不确定它是否对性能有影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多