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