Пользовательская обработка результатов путем вызова процедуры хранилища в Spring Data JPA - PullRequest
0 голосов
/ 18 июня 2020

У меня есть требование вызвать процедуры магазина, которые принимают входные параметры. Эта процедура хранилища возвращает настраиваемый набор результатов, который мне нужно прочитать и обработать дальше, прежде чем вернуться в пользовательский интерфейс. Как мы можем этого добиться?

Например:

@Query("CALL SP_EMPLOYEE_REPORT(:year)",nativeQuery = true)
List<EmpolypeeCustomReportBean> getEmployeeReport(@param("year") Integer year);

1 Ответ

1 голос
/ 18 июня 2020

Учитывая следующую хранимую процедуру.

CREATE PROCEDURE NAME_OF_THE_PROCEDURE(IN param VARCHAR(255), OUT retval INT)

Вы можете вызвать ее из запроса интерфейса:

@Procedure(value = "NAME_OF_THE_PROCEDURE")
int getFromStoredProcedure(String param);

Также с помощью аннотации @Query:

@Query(value = "CALL NAME_OF_THE_PROCEDURE(:input_value);", nativeQuery = true)
Integer findSomeThing(@Param("input_value") Integer name);

Или вы также можете использовать именованный запрос хранимой процедуры.

@Entity
@NamedStoredProcedureQuery(name = "MyObj.getSomethingFromProc", 
  procedureName = "NAME_OF_THE_PROCEDURE", parameters = {
    @StoredProcedureParameter(mode = ParameterMode.IN, name = "param", type = String.class),
    @StoredProcedureParameter(mode = ParameterMode.OUT, name = "retval", type = Integer.class)})
public class MyObj{
    // class definition
}

Затем вызовите его.

@Procedure(name = "MyObj.getSomethingFromProc")
Integer getSomethingFromStoredProc(@Param("param") String model);

Также вы можете использовать свойства resultClasses и resultSetMapping в @NamedStoredProcedureQuery для сложные возвращаемые типы.

Сложный пример , предоставленный Eclipselink:

   @NamedStoredProcedureQuery(
       name="ReadUsingMultipleResultSetMappings",
       procedureName="Read_Multiple_Result_Sets",
       resultSetMappings={"EmployeeResultSetMapping", "AddressResultSetMapping", "ProjectResultSetMapping", "EmployeeConstructorResultSetMapping"}
   )

   @SqlResultSetMappings({
       @SqlResultSetMapping(
           name = "EmployeeResultSetMapping",
           entities = {
               @EntityResult(entityClass = Employee.class)
           }
       ),
       @SqlResultSetMapping(
           name = "EmployeeConstructorResultSetMapping",
           classes = { 
               @ConstructorResult(
                   targetClass = EmployeeDetails.class,
                   columns = {
                       @ColumnResult(name="EMP_ID", type=Integer.class),
                       @ColumnResult(name="F_NAME", type=String.class),
                       @ColumnResult(name="L_NAME", type=String.class),
                       @ColumnResult(name="R_COUNT", type=Integer.class)
                   }
               )
           }
       )
   })
   public Employee(){
       ....
   }
...