2010-05-31 3 views
2

Я пытаюсь выполнить простую хранимую процедуру с помощью Spring/Hibernate с помощью аннотаций. Вот мои фрагменты кода:Выполнение хранимой процедуры из Spring-Hibernate с помощью аннотаций

DAO класс:

public class UserDAO extends HibernateDaoSupport { 

     public List selectUsers(final String eid){ 
      return (List) getHibernateTemplate().execute(new HibernateCallback() { 
        public Object doInHibernate(Session session) throws 
        HibernateException, SQLException 
        { 
         Query q = session.getNamedQuery("SP_APPL_USER"); 
         System.out.println(q); 
         q.setString("eid", eid); 
         return q.list(); 
        } 
       }); 
      } 
    } 

мой объект класса:

@Entity 
    @Table(name = "APPL_USER") 
    @Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
    @DiscriminatorFormula(value = "SUBSCRIBER_IND") 
    @DiscriminatorValue("N") 
    @NamedQuery(name = "req.all", query = "select n from Requestor n") 
    @org.hibernate.annotations.NamedNativeQuery(name = "SP_APPL_USER", 
query = "call SP_APPL_USER(?, :eid)", callable = true, readOnly = true, resultClass = Requestor.class) 

    public class Requestor { 

    @Id 
     @Column(name = "EMPL_ID") 
     public String getEmpid() { 
      return empid; 
     } 

     public void setEmpid(String empid) { 
      this.empid = empid; 
     } 

     @Column(name = "EMPL_FRST_NM") 
     public String getFirstname() { 
      return firstname; 
     } 
    ... 
    } 

    public class Test { 
     public static void main(String[] args) { 
      ApplicationContext ctx = new ClassPathXmlApplicationContext(
        "applicationContext.xml"); 
      APFUser user = (APFUser)ctx.getBean("apfUser"); 

      List selectUsers = user.getUserDAO().selectUsers("EMP456"); 
      System.out.println(selectUsers); 
     } 

    } 

и хранимая процедура:

create or replace PROCEDURE SP_APPL_USER (p_cursor out sys_refcursor, eid in varchar2) 
as 
    empId varchar2(8); 
    fname varchar2(50); 
    lname varchar2(50); 
begin 
    empId := null; 
    fname := null; 
    lname := null; 
    open p_cursor for 
    select l.EMPL_ID, l.EMPL_FRST_NM, l.EMPL_LST_NM 
     into empId, fname, lname 
     from APPL_USER l 
    where l.EMPL_ID = eid; 
end; 

Если я ввести неверный EID, его возвращающий пустой список, который в порядке.

Но когда запись есть, следующий исключение:

Exception in thread "main" org.springframework.jdbc.BadSqlGrammarException: Hibernate operation: could not execute query; bad SQL grammar [call SP_APPL_USER(?, ?)]; nested exception is java.sql.SQLException: Invalid column name 

Мне нужно изменить сущность (Requestor.class) делать? Как будет преобразован REFCURSOR в список? Ожидается, что хранимая процедура вернет более одной записи.

ответ

3

Это из-за bug в спящем режиме. Я изменил хранимую процедуру, чтобы получить все столбцы, и это сработало хорошо.

Смежные вопросы