Spring data jpa вызывает хранимую процедуру с большим количеством параметров - PullRequest
0 голосов
/ 19 марта 2020

Можно ли сопоставить объект со всеми параметрами внутри NamedStoredProcedureQuery? Мне нужно вызвать хранимую процедуру, которая содержит более 40 параметров, которые она принимает. Следующий код становится действительно длинным и трудным для чтения:

@NamedStoredProcedureQuery(
    name="SomeSPName",
    procedureName="SomeSPName",
    resultClasses={ MyEntity.class },
    parameters = {
        @StoredProcedureParameter(name="PACKAGE", type=String.class,  mode=ParameterMode.IN),
        @StoredProcedureParameter(name="APPNM",   type=String.class,  mode=ParameterMode.IN),
        // 40 more required parameters here...
)


public interface MyRepository extends JpaRepository<MyEntity, Long> {

    @Query
    @Procedure(name="SomeSPName")
    long getResult(@Param("PACKAGE") String package, @Param("APPNM") String appnm, /* The rest of the params here */);

}

Поэтому мой вопрос заключается в том, могу ли я заменить аргументы внутри getResult с объектом, который имеет все методы получения и установки параметров, и Hibernate автоматически назначит параметры правильно. Например:

public interface MyRepository extends JpaRepository<MyEntity, Long> {

    @Query
    @Procedure(name="SomeSPName")
    long getResult(MyObject params);

}

Здесь MyObject будет иметь поля, соответствующие каждому из StoredProcedureParameter, определенных сверху. Надеюсь, это имеет смысл. Я просто не хочу помещать все 40+ параметров в определение getResult. Я использую DB2, если это имеет значение. Любая помощь будет оценена!

1 Ответ

0 голосов
/ 19 марта 2020
EntityManager entityManager;

public Long getResult(Params params) {
    StoredProcedureQuery storedProcedure = entityManager
        .createStoredProcedureQuery("SomeSPName", Long.class)
        .registerStoredProcedureParameter("PACKAGE", String.class, ParameterMode.IN)
        .registerStoredProcedureParameter("APPNM", String.class, ParameterMode.IN)
        //...
        .setParameter("PACKAGE", params.getPackage())
        .setParameter("APPNM", params.getAppNm())
        //...
        ;

    return storedProcedure.getSingleResult();
}
...