无法使用 FUNC() 解决 JPQL :parameter 问题

Can't solve the JPQL :parameter problem by using FUNC()

好吧,简而言之,我已经在没有使用任何参数的情况下完成了实际的 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 没问题,但在这个 FUNC() 中似乎我不应该像那样放置参数并且需要一些解决方法。我一直在谷歌搜索,但找不到任何结果。

错误是这样的

You have attempted to set a parameter value using a name of lastMonth,'mm-yyyy') that does not exist in the query string

如您所见,FUNC() 中的参数带有其后面的 FUNC() 参数。我错过了什么?请赐教。

确保您使用的是 setString 作为参数类型。

我总是难以在 JPA 中使用命名参数,具体取决于查询的创建方式 - 尝试使用序数参数,例如:?1 并按索引设置它们。

我会避免使用 FUNC,因为如果您不太小心的话,它可能会带来一些重大开销。

这个问题有一个解决方法。

最初,简化的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 需要是动态的,因为日期不会是静态的,所以通过使用 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)