Как вызвать функцию postgresql с более чем одним входным и выходным параметром из Java? - PullRequest
0 голосов
/ 03 апреля 2020

Есть функция, записанная в 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

Как вызвать эту функцию из Java Spring boot используя JPA и напрямую назначить его в List?

Если мы можем создать класс с тем же именем, что и имя столбца, возвращаемое из функции.

1 Ответ

0 голосов
/ 13 апреля 2020

Я получил ответ, попробовав несколько методов и перестановок. Вы можете вызвать функцию db с помощью nativeQuery или с помощью StoredProcedureQuery (который внутренне использует тот же nativequery, что и CallableStatement)

Вы можете автоматически связать свой класс entityManager:

 @Autowired
EntityManager entityManager;

Вы можете вызвать хранимую Procedure или функция от 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();

. Вы получите resultList в форме списка. Object [] будет иметь значения, сопоставленные с вашим типом возврата, определенным функцией в схеме, и вам необходимо выполнить итерацию для преобразования в ваш объект.

(Вы можете получить имена полей (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
}
...