Не удается решить проблему с JPQL: параметром с помощью FUN C () - PullRequest
0 голосов
/ 06 января 2020

Хорошо, просто для краткости, я выполнил реальный JPQL без использования каких-либо параметров, и он выглядит следующим образом.

SELECT count(dt) 
FROM transaction dt 
WHERE dt.transactionType = 'TEST' 
AND dt.date 
BETWEEN FUNC('TO_DATE','01-2019','mm-yyyy') 
AND FUNC('TO_DATE','02-2019','mm-yyyy')

Это работает! Но дело в том, что теперь мне нужно сделать транзакцию и дату в качестве параметра, и вот как это выглядит

SELECT count(dt) 
FROM transaction dt 
WHERE dt.transactionType = :transType 
AND dt.date 
BETWEEN FUNC('TO_DATE',:lastMonth,'mm-yyyy') 
AND FUNC('TO_DATE',:nextMonth,'mm-yyyy')

Так что: с transType все в порядке, но внутри этого FUN C () выглядит так: Я не должен ставить этот параметр просто так, и мне нужен обходной путь. Я гуглил и не могу найти никакого результата.

Ошибка была такой:

Вы пытались установить значение параметра, используя имя lastMonth, 'mm- yyyy '), которого нет в строке запроса

Как вы можете видеть, параметр внутри FUN C () принимает параметр позади него, который имел в виду FUN C (). Что я пропустил? Просвети меня, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Существует обходной путь для этой проблемы.

Первоначально упрощенный SQL, как показано ниже:

SELECT count(*) 
FROM table tb
WHERE tb.date between to_date('01-2020','mm-yyyy') and to_date('02-2020','mm-yyyy');

И, непосредственно преобразовав упрощенный SQL в JPQL, получается как таковой:

SELECT count(tb) 
FROM table tb 
WHERE tb.date BETWEEN FUNC('TO_DATE','01-2020','mm-yyyy') AND FUNC('TO_DATE','02-2020','mm-yyyy')

Но JPQL должен быть динамическим c, так как дата не будет stati c, поэтому с помощью параметра JPQL, чтобы этот JPQL можно было использовать в любой день, инстинктивно я подумал использовать как таковой:

SELECT count(tb) 
FROM table tb 
WHERE tb.date BETWEEN FUNC('TO_DATE',:fromDate,'mm-yyyy') AND FUNC('TO_DATE',:toDate,'mm-yyyy')

Но, как мой первоначальный вопрос, когда этот поток впервые начался, такой JPQL не будет работать. Итак, как я нашел обходной путь? Относительно просто на самом деле.

Вместо того, чтобы использовать это, чтобы получить дату ранжирования (поскольку sql мудро я использую to_date)

WHERE tb.date BETWEEN FUNC('TO_DATE','','') AND FUNC('TO_DATE','','')

Я использовал это

WHERE FUNC('TO_CHAR','','') between (--fromDate) and (--toDate)

Что в итоге привело к окончательной рабочей JPQL

SELECT count(tb) 
FROM table tb 
WHERE FUNC('TO_CHAR',tb.date,'mm-yyyy') BETWEEN (:fromDate) AND (:toDate)
0 голосов
/ 06 января 2020

Убедитесь, что вы используете setString для типа параметра.

У меня всегда были трудности с именованными параметрами в JPA, в зависимости от того, как был создан запрос - попробуйте использовать порядковые параметры, например:? 1 и set их по индексу.

Я бы избегал FUN C, так как это может повлечь за собой серьезные накладные расходы, если вы не будете очень осторожны.

...