Ошибки появляются во время попытки запроса к обработанной процедуре (хранимая функция) с Oracle + Spring Data Jpa - PullRequest
0 голосов
/ 27 марта 2020

У меня есть скрипт для создания сохраненной функции.


CREATE OR REPLACE TYPE OBJ_EMPL AS OBJECT
(
employeeID NUMBER(19,0),
address  VARCHAR2(100 CHAR),
first_Name    VARCHAR2(50 CHAR),
last_Name    VARCHAR2(50 CHAR)

);


CREATE OR REPLACE TYPE LIST_OBJ_EMPL IS TABLE OF OBJ_EMPL;

CREATE OR REPLACE FUNCTION GET_ALL_EMPLOYEES RETURN LIST_OBJ_EMPL IS

varObjEmpl LIST_OBJ_EMPL;


BEGIN
   SELECT OBJ_EMPL ( 
   employeeID,
   first_Name,
   last_Name,
   address
   )

        BULK COLLECT INTO varObjEmpl
        FROM EMPLOYEES; 

   RETURN varObjEmpl;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       return NULL;
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
END GET_ALL_EMPLOYEES;
/


--SELECT * FROM TABLE(getListEmployees);



/*

CREATE TABLE EMPLOYEES
   (EMPLOYEEID NUMBER(19,0) NOT NULL ENABLE,
    ADDRESS VARCHAR2(100 CHAR),
    FIRST_NAME VARCHAR2(50 CHAR),
    LAST_NAME VARCHAR2(50 CHAR),
    CONSTRAINT PK_EMPLOYEEID PRIMARY KEY (EMPLOYEEID)
     );

     */

  • Entity
@Entity
@Table(name = "employees")
@NamedStoredProcedureQueries({
        @NamedStoredProcedureQuery(name = "getListEmployees",
                procedureName = "get_all_employees",
                resultClasses = Employee.class)
})
public class Employee {

    @Id
    @SequenceGenerator(name = "jpaSequence.Employee",
            sequenceName = "SEQUENCE_EMPLOYEE",
            allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "jpaSequence.Employee")
    @Column(name = "employeeID")
    private Long employeeID;

    @Column(name = "first_Name")
    @Size(message = "Field 'firstName' can't be более {} ",max = 50)
    private String firstName;

    @Column(name = "last_Name")
    @Size(message = "Field 'firstName' can't be более {} ",max = 50)
    private String lastName;

    @Column(name = "address")
    @Size(message = "Field 'firstName' can't be более {} ",max = 100)
    private String address;

    public Employee() {
    }

  • хранилище
public interface EmployeesRepository
        extends CrudRepository<Employee, Long>,
        EmployeesRepositoryCustom {
}
public interface EmployeesRepositoryCustom {
    List<Employee> getAllEmployees();
}
@Repository
public class EmployeesRepositoryImpl implements EmployeesRepositoryCustom {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public List<Employee> getAllEmployees() {

        StoredProcedureQuery getAllEmployees =
                entityManager.createNamedStoredProcedureQuery("getListEmployees");

        return getAllEmployees.getResultList();
    }
}

Когда я пытаюсь получить данные, у меня возникает исключение.

Ошибка вызова CallableStatement.getMoreResults; SQL [get_all_employees]; вложенное исключение: org.hibernate.exception.SQLGrammarException: ошибка вызова CallableStatement.getMoreResults

java. sql .SQLException: ORA-06550: строка 1, столбец 7: PLS-00221: «GET_ALL_EMPLOYEES» - это не процедура или не определена ORA-06550: строка 1, столбец 7: PL / SQL: оператор игнорируется

Возможно, вы не можете использовать аннотации @ NamedStoredProcedureQuery для работать с сохраненными функциями? Я не знаю что делать У кого есть идеи?

1 Ответ

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

Раствор

public interface EmployeesRepository
        extends CrudRepository<Employee, Long>,
        EmployeesRepositoryCustom {

    String query = "select * from table (get_all_employees)";

    @Query(nativeQuery = true, value = query)
    Iterable<Employee> findAllEmployees();

}

...