JPA标准生成器:如何将ArrayList传递给Oracle函数?

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

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

Oracle类型:

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

JPA标准构建器调用

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次) )然后我想将这个点数组传回给函数进行处理。

我需要使用条件生成器来完成此功能只是查询的一部分。

谢谢你的帮助。


这可能有所帮助。 如此处所述,适用于用户定义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);
链接地址: http://www.djcxy.com/p/37917.html

上一篇: JPA Criteria Builder: How to pass ArrayList to Oracle function?

下一篇: Rails engine, invoking container app's native migration generator