В JPA 2.0 я пытаюсь вызвать функцию Oracle, которая возвращает SYSREF CURSOR и принимает один входной параметр (ID).JPA 2.0 - Функция Oracle с использованием @NamedNativeQuery - Ошибка
Требование: если входной параметр имеет значение идентификатора, если необходимо извлечь эту запись, если входное значение равно null, оно должно вернуть все данные.
Он отлично работает, если я передаю входной параметр (ID), но если я передам значение null для ввода, я получу эту ошибку.
Он отлично работает на JDBC, я не уверен, если я отсутствующий JPA синтаксис где-то ...
Ошибка:
Caused by: java.sql.SQLException: ORA-06550: line 1, column 13:
PLS-00306: wrong number or types of arguments in call to 'GET_ENTITIES'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
Entity
@Entity
@Table(name = "ENTITIES")
@NamedNativeQuery(name = "getEntities", query = "{ ? = call pkg_entities.get_entities(:IN_ENTITY_ID)}", resultClass = Eentity.class, hints = { @QueryHint(name = "org.hibernate.callable", value = "true") })
Репозиторий
@Primary
@Repository
@Transactional
public class EntityRepositoryJpa20Impl implements EntityRepository {
@PersistenceContext
EntityManager entityManager;
@Transactional(readOnly = true)
@Override
public List<Eentity> getEntities(String id) {
Query query = entityManager.createNamedQuery("getEntities");
query.setParameter("IN_ENTITY_ID", id);
return query.getResultList();
}
}
Тест
@Test
public void testNotWorking() {
List<Eentity> entities = entityRepository.getEntities(null);
}
@Test
public void testWorksFine() {
List<Eentity> entities = entityRepository.getEntities("900001");
}
функция Oracle
function get_entities(in_entity_id number) return sys_refcursor
is
v_cursor sys_refcursor;
begin
open v_cursor for
select
entity_id,
b,
c
from entities e
where e.entity_id = nvl(in_entity_id,e.entity_id)
and e.is_excluded = 'N'
order by e.entity_id;
return v_cursor;
end get_entities;
UPDATE: -
Если я прохожу пустая строка ("") он работал отлично, но сделал не работает, когда я передать null. теперь я создал два метода Java один для каждого, как показано ниже,
@Entity
@Table(name = "ENTITIES")
@NamedNativeQueries(value = {
@NamedNativeQuery(name = "getEntity", query = "{ ? = call pkg_entities.get_entities(:IN_ENTITY_ID)}", resultClass = Eentity.class, hints = { @QueryHint(name = "org.hibernate.callable", value = "true") }),
@NamedNativeQuery(name = "getEntities", query = "{ ? = call pkg_entities.get_entities()}", resultClass = Eentity.class, hints = { @QueryHint(name = "org.hibernate.callable", value = "true") }) })
public class Eentity implements Serializable {
вы можете предоставить ваш корпус пакета oracle, метод get_entities – sgpalit
@sgpalit Спасибо, добавлена функция oracle. – Jay