如何从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
}