java – JPA Criteria Builder:如何将ArrayList传递给Oracle函数?

我有一个Oracle函数,它接受一个POINTS%ROWTYPE表.我想使用CriteriaBuilder类从JPA调用函数,该类具有数据库函数功能.当我尝试构建查询时,它死于抱怨ArrayLists不是函数的有效查询参数.

如何将ArrayList从JPA传入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
)

Oracle类型:

create or replace package types_pkg
as
type point_array is table of FILTERPOINT%rOWTYPE;
end types_pkg;

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 ) );

例外:

org.apache.openjpa.persistence.ArgumentException: 
The specified parameter of type "class middle.ware.FilterPoint" is not a valid query parameter.

本质上,我想在函数调用之外获取一个点数组,所以我只需要获取一次(现在我在函数调用中执行select,所以每次调用函数时它都会运行,这可能是100,000′ s次.)然后我想将该数组点传递回函数进行处理.

我需要使用条件构建器,这个函数只是查询的一部分.

谢谢你的帮助.

解决方法

这可能有所帮助.如 here所述,用户定义的TABLE类型的适当java类型是java.sql.Array.我想你需要将你的列表转换成这种类型.一种可行的方法,只需在连接上调用 method createArrayOf(另请参见本 answer):
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);

相关文章

应用场景 C端用户提交工单、工单创建完成之后、会发布一条工...
线程类,设置有一个公共资源 package cn.org.chris.concurre...
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量