Поле таблицы, установленное дважды в HQL, появляется только один раз в скомпилированном SQL - PullRequest
0 голосов
/ 02 декабря 2019

Мой HQL-запрос соответствует ( Спящий режим с 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)

Сгенерированный SQL с помощью Hibernate

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

Примечание- отсутствует преобразование LastModifiedByUser.info в методе CHARINDEX (2nd parameter).

Ответы [ 2 ]

0 голосов
/ 09 декабря 2019

Я сделал обходной путь, сделав пользовательскую функцию, скажем, functionXyz (), которая принимает входную строку и внутренне просто возвращает что-то похожее на приведенное ниже. чтобы вызвать эту функцию. Не уверен, влияет ли это на производительность.

0 голосов
/ 02 декабря 2019

Не могли бы вы удалить функцию CHARINDEX? Я не смог найти его в разделе выражения функции , поэтому, возможно, движок не смог правильно его перевести.

Кроме того, вам разрешено использовать собственный SQL , поэтому вы можете попробовать создать простой оператор CHARINDEX и запустить его таким образом.

Также вы можете попробоватьиспользовать LOCATE в качестве альтернативы тому, что вы делаете.

...