Oracle:如何在容器生成的jpa查询WHERE子句中使用基于函数的索引

时间:2012-10-31 03:30:48

标签: java oracle jpa ejb jpql

我们有一个数据表,它有一个基于函数的索引(数据库是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';

2 个答案:

答案 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