1

我们有一个数据表,其中有一个基于函数的索引(数据库是 Oracle)。但是在我们的 Java EE ejb 应用程序中,系统使用 jpa 查询访问数据。

但是为了强制 oracle 使用基于函数的索引而不是进行全表扫描,我需要一种方法来告诉 jpa 容器生成带有在 sql 查询的 WHERE 子句中的索引中定义的函数的 sql。

据我所知,我们必须使用本机查询来在生成的查询中创建自定义项。但是为了使用本机查询,我们必须进行许多代码更改。任何人都可以建议解决此问题的任何其他解决方法吗?

索引:(我们需要对 Dev_Id + Dev_Type 强制执行唯一约束,但有时 Dev_Id 可以为空,而 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';
4

2 回答 2

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 = ?

还是表上计算函数的虚拟列?

于 2012-10-31T03:49:50.337 回答
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,但您可以使用FUNC可用作 Eclipselink 扩展的等效版本。

于 2016-01-22T13:02:55.213 回答