如何从Java调用具有多个输入和输出参数的postgresql函数?

如何从Java调用具有多个输入和输出参数的postgresql函数?,java,postgresql,spring-boot,jpa,stored-functions,Java,Postgresql,Spring Boot,Jpa,Stored Functions,有一个用postgresql(V_11)编写的函数,其中有多个输入参数和多个输出参数作为表返回 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 colu

有一个用postgresql(V_11)编写的函数,其中有多个输入参数和多个输出参数作为表返回

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从JavaSpringBoot调用此函数并直接将其分配给列表


如果我们可以创建一个与函数返回的列名同名的类。

在尝试了多种方法和排列之后,我得到了答案。 您可以通过nativeQuery或使用StoredProcedureQuery(内部使用相同的nativeQuery,与CallableStatement相同)调用db函数

您可以自动连接entityManager类:

 @Autowired
EntityManager entityManager;
您可以通过storedProcedure调用storedProcedure或函数,如下所示:

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();
StoredProcedureQuery=entityManager
.createStoredProcedureQuery(“架构\名称.函数\名称”)
.registerStoredProcedureParameter(1,String.class,ParameterMode.IN)
.registerStoredProcedureParameter(1,Integer.class,ParameterMode.IN)
.registerStoredProcedureParameter(1,Integer.class,ParameterMode.IN)
.setParameter(1,参数1)
.setParameter(2,参数2)
.设置参数(3,参数3);
query.execute();
List dataList=query.getResultList();
您将以列表形式获得结果列表。对象[]的值将映射到模式中的函数定义的返回类型,您需要迭代才能在对象中转换

(您可以在调试模式下获取查询对象中的字段名(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
}
List myClassObjectList=new ArrayList();
dataList.forEach((数据)->{
MyClass myClassObject=新的MyClass();
myClassObject.setField1(Integer.parseInt(slsTOData[0].toString());
//代码继续转换逻辑
}

从函数名(?,?)中选择*
我们是否需要将其设置为本机查询,并且函数返回一个自定义表。那么如何将其分配给特定的POJO?