2015-08-26 1 views
2

В 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 { 
+0

вы можете предоставить ваш корпус пакета oracle, метод get_entities – sgpalit

+0

@sgpalit Спасибо, добавлена ​​функция oracle. – Jay

ответ

1

Вы могли бы попытаться изменить ваш/SQL пакет PL, добавляя значение параметра по умолчанию:

IN_ENTITY_ID IN NUMBER DEFAULT NULL 

т.е. в вашем случае:

function get_entities(in_entity_id number default null) return sys_refcursor 
1

DEFAULT NULL попробуйте добавить это к вашему входному параметру

+0

Большое спасибо за вас, ребята. – Jay