无法使用 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)
好吧,简而言之,我已经在没有使用任何参数的情况下完成了实际的 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)
这最终导致了
的最终工作 JPQLSELECT count(tb)
FROM table tb
WHERE FUNC('TO_CHAR',tb.date,'mm-yyyy') BETWEEN (:fromDate) AND (:toDate)