Gui*_*rum 7 java oracle plsql jpa openjpa
我有一个Oracle函数,它接受一个POINTS%ROWTYPE表.我想使用CriteriaBuilder类从JPA调用此函数,该类具有数据库函数的功能.当我尝试构建查询时,它会死于抱怨ArrayLists不是函数的有效查询参数.
如何将ArrayList中的ArrayList传入Oracle函数?
Oracle函数签名:
CREATE OR REPLACE FUNCTION LOCATION_CONTAINS
(
LATITUDE_IN IN DOUBLE PRECISION,
LONGITUDE_IN IN DOUBLE PRECISION,
points IN types_pkg.point_array,
numPoints IN INTEGER
)
Run Code Online (Sandbox Code Playgroud)
Oracle类型:
create or replace package types_pkg
as
type point_array is table of FILTERPOINT%ROWTYPE;
end types_pkg;
Run Code Online (Sandbox Code Playgroud)
JPA Criteria Builder调用
List<FilterPoint> points = getPoints(location_name);
int numPoints = points.size();
Expression ex =
cb.function( "LOCATION_CONTAINS",
Integer.class,
entity.get( "latitude" ),
entity.get( "longitude" ),
cb.literal( points ),
cb.literal( numPoints ) );
Run Code Online (Sandbox Code Playgroud)
例外:
org.apache.openjpa.persistence.ArgumentException:
The specified parameter of type "class middle.ware.FilterPoint" is not a valid query parameter.
Run Code Online (Sandbox Code Playgroud)
本质上,我想在函数调用之外获取一个点数组,所以我只需要获取一次(现在我在函数调用中执行select,所以每次调用函数时它都会运行,这可能是100,000' s次.)然后我想将该数组点传递回函数进行处理.
我需要使用条件构建器才能将此函数作为查询的一部分.
谢谢你的帮助.
这可能会有所帮助。正如此处所述,用户定义TABLE类型的适当 Java 类型是java.sql.Array。我想你需要将你的列表转换为这种类型。可能的方法之一是,只需在连接上调用方法(另请参阅此 答案):createArrayOf
Session session = (Session)em.getDelegate();
Connection conn = session.connection();
String[] data = points.toArray(new FilterPoint[points.size()]);
java.sql.Array sqlArray = conn.createArrayOf(typeName, data);
Run Code Online (Sandbox Code Playgroud)