2

我正在尝试使用注释使用 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 将如何转换为列表?存储过程应返回多条记录。

4

1 回答 1

3

那是因为休眠中的错误。我已经修改了存储过程以获取所有列,并且效果很好。

于 2010-05-31T17:30:35.983 回答