Возвращение двух определяемых пользователем типов объектов из хранимой процедуры и вызов хранимой процедуры на уровне хранилища с использованием spring-data-jpa - PullRequest
0 голосов
/ 24 марта 2020

У меня есть хранимая процедура, как указано ниже:

PROCEDURE TestABC (tableName IN VARCHAR2, cardID IN VARCHAR2, detail OUT UserDefineObjectA, td OUT UserDefineObjectB);

UserDefineObjectA, UserDefineObjectB оба определены пользователем, и оба имеют одинаковые поля, и я исключаю, что оба объекта должны вернуться из процедуры. За возвратом обоих объектов стоит некоторое дело.

Я написал класс метода с аннотацией @Repository, который имеет следующий метод. Я использую аннотацию @Procedure от spring-data -jpa. Текущая реализация @Procedure может занять только один outputParameterName. Но для моего случая я исключаю возвращение двух пользовательских типов объектов.

@Procedure(procedureName = "TestABC" , outputParameterName = "{UserDefineObjectA, UserDefineObjectB}")
public List<Object[]> getAllDetails(@Param("tableName") String tableName, @Param("cardID ") String cardID);

Затем я попробовал разные подходы, используя @NamedStoredProcedureQuery. Но проблема с этим подходом заключается в том, что я должен записать все эти запросы в метку Entity, которые добавляют больше сложности. Я должен создать сущность и записать все хранимые процедуры и вызвать репозиторий, как показано ниже:

как получить пользовательский SQL параметр процедуры из java class

Есть ли способ лучше решить эту проблему? Могу ли я написать @NamedStoredProcedureQuery на уровне метода внутри моего класса, который аннотирован как @Repository.

Пример старого кода, который я пытаюсь реализовать.

    callableStatement = connection.prepareCall("{call ABC(?,?,?,?)}");

      callableStatement.setString(1, "test");
      callableStatement.setString(2, "12345679090978");

      callableStatement.registerOutParameter(3, Types.ARRAY, AConstants.UserDefineObjectA);
      callableStatement.registerOutParameter(4, Types.STRUCT, AConstants.UserDefineObjectB);

      callableStatement.execute();
      return (Object[]) ((java.sql.Array) callableStatement.getObject(3)).getArray();

1 Ответ

0 голосов
/ 24 марта 2020

Я думаю, что есть два способа Вы можете решить это.

1. Обновление данных пружины JPA версия

Поддерживаются параметры множественного вывода начиная с данных пружины JPA 2.2-RC1.
https://spring.io/blog/2019/06/17/spring-data-moore-rc1-and-lovelace-sr9-released
https://jira.spring.io/browse/DATAJPA-707

Метод интерфейса просто должен иметь тип возвращаемого значения Map, чтобы к каждому выходному параметру можно было получить доступ по имени ключа:

/**
 * Explicitly mapped to named stored procedure "User.plus1IOoptional" in {@link EntityManager}. 
 * Returns 2 out params
 * as a Map, second one amoung which is null.
*/
@Procedure(name = "User.plus1IOoptional") // DATAJPA-1579
Map<String, Integer> entityAnnotatedCustomNamedProcedurePlus1IOoptional(@Param("arg") Integer arg);

Больше примеров на Github

2. Используйте JPA API напрямую, через несколько более сложные

StoredProcedureQuery proc = em.createNamedStoredProcedureQuery("plus1");

proc.setParameter("arg", 1);
proc.execute();
Integer res1 = (Integer) proc.getOutputParameterValue("res1");
Integer res2 = (Integer) proc.getOutputParameterValue("res2");

Надеюсь, это поможет.

...