我们有一个数据表,它有一个基于函数的索引(数据库是Oracle)。但是在我们的Java EE ejb应用程序中,系统使用jpa查询访问数据。
但是为了强制oracle使用基于函数的索引而不是进行全表扫描,我需要一种方法来告诉jpa容器使用在WHERE子句中的索引中定义的函数生成sql。 sql查询。
据我所知,我们必须使用本机查询在生成的查询中创建自定义。但是为了使用本机查询,我们必须进行许多代码更改。 有谁可以建议任何其他解决这个问题的工作?
索引:(我们需要对Dev_Id + Dev_Type强制执行唯一约束,但有时Dev_Id可以为null,而Dev_Type可以重复。)
(NVL2(Dev_Id, Dev_Id, NULL), NVL2(Dev_Id, Dev_Type, NULL))
查询我们需要:(为了使用索引)
Select * from some_table where NVL2(Dev_Id, Dev_Id, NULL) = 'some_val';
容器生成的查询:
Select * from some_table where Dev_Id = 'some_val';
答案 0 :(得分:1)
也许创建一个视图并让JPA通过这个选项?
CREATE VIEW SOME_VIEW AS SELECT SOME_TABLE.*,
NVL2(Dev_Id, Dev_Id, NULL) AS NVL_DEV_ID FROM SOME_TABLE;
SELECT * FROM SOME_VIEW WHERE NVL_DEV_ID = ?
或者表上的一个虚拟列是否计算了函数?
答案 1 :(得分:1)
JPA 2.1包含一个FUNCTION
运算符,允许调用特定于DB的函数:
from SomeEntity where function('NVL2', devId, devId, null) = 'some_val';
如果您没有使用JPA 2.1,但使用的是Eclipselink> = 2.4,您也可以使用FUNCTION
,因为它可以作为Eclipselink扩展程序使用。
如果您使用的是Eclipselink 2.3.x,则表示您没有FUNCTION
,但可以使用可用作Eclipselink扩展程序的等效FUNC
。