gpt4 book ai didi

java - 使用注释从 Spring-Hibernate 执行存储过程

转载 作者:行者123 更新时间:2023-12-04 06:52:23 25 4
gpt4 key购买 nike

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

最佳答案

那是因为 bug在 hibernate 状态。
我修改了存储过程以获取 全部 列,它运行良好。

关于java - 使用注释从 Spring-Hibernate 执行存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2943497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com