JPQL 动态查询接受多天
Posted
技术标签:
【中文标题】JPQL 动态查询接受多天【英文标题】:JPQL dynamic query to accept multiple days 【发布时间】:2021-10-31 22:33:00 【问题描述】:我们如何为以下原生查询编写 JPA 或 JPQL 查询?参考链接-SQL Oracle - How to make query dynamic to accept multiple days to calculate the expiration
SELECT * FROM PASS_EXP
WHERE TRUNC(EXPIRY_DT) IN (
SELECT TRUNC(SYSDATE) + COLUMN_VALUE
FROM TABLE(SYS.ODCINUMBERLIST(1, 3, 5, 7, 15))
);
或者
SELECT p.*
FROM PASS_EXP p
INNER JOIN TABLE(SYS.ODCINUMBERLIST(1, 3, 5, 7, 15)) t
ON ( p.expiry_dt >= TRUNC(SYSDATE) + t.COLUMN_VALUE
AND p.expiry_dt < TRUNC(SYSDATE) + t.COLUMN_VALUE + 1 );
假设 1、3、5、7、15 将作为 List 出现在查询中
【问题讨论】:
你不能,因为 JPQL 没有 TABLE 函数。但是恕我直言,这不是问题,因为您可以从本机查询中获取实体 如何使用原生查询获取实体? 【参考方案1】:您不需要将查询转换为 JPQL(尽管由于 JPQL 中缺少等效函数,这不可能。
但是您可以简单地使用本机查询来返回实体。我假设你有一个表 PASS_EXP 的实体。
那么你可以这样做:
List<PassExp> entities = em.createNativeQuery("SELECT * FROM PASS_EXP " +
"WHERE TRUNC(EXPIRY_DT) IN ( " +
" SELECT TRUNC(SYSDATE) + COLUMN_VALUE " +
" FROM TABLE(SYS.ODCINUMBERLIST(1, 3, 5, 7, 15)) " +
")").getResultList();
【讨论】:
以上是关于JPQL 动态查询接受多天的主要内容,如果未能解决你的问题,请参考以下文章