如何从Java调用带有多个输入输出参数的postgresql函数?
How to call postgresql function with more than one input and output parameter from Java?
有一个用 postgresql(V_11) 编写的函数,具有多个输入参数和多个输出参数,返回为 table。
CREATE OR REPLACE FUNCTION schema_name.function_name(param1 varchar, param2 int, param3 int)
RETURNS TABLE (column1 int, column2 numeric, column3 int, column3 int)
AS $$
return query
SELECT column1, column2, column3, column3
FROM schema_name.table
WHERE {condition}
BEGIN
如何使用 JPA 从 Java Spring 引导调用此函数并将其直接分配给列表?
如果我们可以创建一个 class 与函数返回的列名相同的名称。
在尝试了多种方法和排列后,我得到了答案。
您可以通过 nativeQuery 或使用 StoredProcedureQuery(内部使用相同的 nativequery,与 CallableStatement 相同)调用 db 函数
您可以自动连接您的 entityManager class :
@Autowired
EntityManager entityManager;
您可以像这样通过 StoredProcedureQuery 调用存储过程或函数:
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("schema_name.function_name")
.registerStoredProcedureParameter(1, String.class, ParameterMode.IN)
.registerStoredProcedureParameter(1, Integer.class, ParameterMode.IN)
.registerStoredProcedureParameter(1, Integer.class, ParameterMode.IN)
.setParameter(1, param1)
.setParameter(2, param2)
.setParameter(3, param3);
query.execute();
List<Object[]> dataList= query.getResultList();
您将得到列表形式的结果列表。 Object[] 会将值映射到您的 return 类型,该类型由架构中的函数定义,您需要迭代以在对象中进行转换。
(您可以在调试模式下获取查询对象中的字段名称(ColumnIndexNames):请告诉我是否可以直接以列表形式获取结果)
迭代 dataList 并转换为 MyClass 对象列表。
List<MyClass> myClassObjectList = new ArrayList<>();
dataList.forEach( (data) -> {
MyClass myClassObject= new MyClass();
myClassObject.setField1(Integer.parseInt(slsTOData[0].toString()));
// code goes on for conversion logic
}
有一个用 postgresql(V_11) 编写的函数,具有多个输入参数和多个输出参数,返回为 table。
CREATE OR REPLACE FUNCTION schema_name.function_name(param1 varchar, param2 int, param3 int)
RETURNS TABLE (column1 int, column2 numeric, column3 int, column3 int)
AS $$
return query
SELECT column1, column2, column3, column3
FROM schema_name.table
WHERE {condition}
BEGIN
如何使用 JPA 从 Java Spring 引导调用此函数并将其直接分配给列表?
如果我们可以创建一个 class 与函数返回的列名相同的名称。
在尝试了多种方法和排列后,我得到了答案。 您可以通过 nativeQuery 或使用 StoredProcedureQuery(内部使用相同的 nativequery,与 CallableStatement 相同)调用 db 函数
您可以自动连接您的 entityManager class :
@Autowired
EntityManager entityManager;
您可以像这样通过 StoredProcedureQuery 调用存储过程或函数:
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("schema_name.function_name")
.registerStoredProcedureParameter(1, String.class, ParameterMode.IN)
.registerStoredProcedureParameter(1, Integer.class, ParameterMode.IN)
.registerStoredProcedureParameter(1, Integer.class, ParameterMode.IN)
.setParameter(1, param1)
.setParameter(2, param2)
.setParameter(3, param3);
query.execute();
List<Object[]> dataList= query.getResultList();
您将得到列表形式的结果列表。 Object[] 会将值映射到您的 return 类型,该类型由架构中的函数定义,您需要迭代以在对象中进行转换。
(您可以在调试模式下获取查询对象中的字段名称(ColumnIndexNames):请告诉我是否可以直接以列表形式获取结果)
迭代 dataList 并转换为 MyClass 对象列表。
List<MyClass> myClassObjectList = new ArrayList<>();
dataList.forEach( (data) -> {
MyClass myClassObject= new MyClass();
myClassObject.setField1(Integer.parseInt(slsTOData[0].toString()));
// code goes on for conversion logic
}