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 动态查询接受多天的主要内容,如果未能解决你的问题,请参考以下文章

JPQL / Hibernate 查询的动态表名

JPQL 查询删除不接受声明的 JOIN?

22 Specifications动态查询

Specifications动态查询

Specifications动态查询

spring数据动态组合@query查询