我一直在尝试使用Hibernate执行Oracle存储过程。这不是用于生产 - 而是用于Java源解析项目,我正在追求。简单来说,我无法从Oracle存储过程返回值。
我搜索并阅读了SO,Hibernate社区/文档(Native SQL章节)链接中的所有相关链接,并尝试了这些建议,但不知何故无法让它们起作用。以下是我的消息来源 - 我只包括相关部分。
我的实体类。我保留了PL / SQL OUT参数的第一个参数。
Login.java
@NamedNativeQuery(
name = "getLoginDet",
query = "call GET_LOGIN_DET(?,:userId)",
resultClass = Login.class)
@Entity
@Table(name = "T_LOGIN_DET")
public class Login {
Oracle存储过程:GET_LOGIN_DET.sql
。根据Hibernate Spec
OUT REFCURSOR
create or replace PROCEDURE GET_LOGIN_DET(listLogin OUT SYS_REFCURSOR,userId IN VARCHAR2)
AS
BEGIN
OPEN listLogin FOR
SELECT *
FROM T_LOGIN_DET
WHERE USER_ID = userId;
END GET_LOGIN_DET;
我的DAO类:我只绑定了命名参数,忽略了第一个?在命名的查询中。
Session session = sessionFactory.openSession();
List results = session.getNamedQuery("getLoginDet").setParameter("userId", u.getUserId()).list();
我的Hibernate配置
<bean id="mysessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configurationClass">
<value>org.hibernate.cfg.AnnotationConfiguration</value>
</property>
<property name="annotatedClasses">
<list>
<value>com.cogn.gto.sea.employee.entity.Employee</value>
<value>com.cogn.gto.sea.employee.entity.Department</value>
<value>com.cogn.gto.sea.login.entity.User</value>
<value>com.cogn.gto.sea.login.entity.Login</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
<!-- <prop key="hibernate.hbm2ddl.auto">update</prop> -->
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
但是,我总是最终得到Hibernate QueryException / Java SQLException
Expected positional parameter count: 1, actual parameters: [] [{call GET_LOGIN_DET(?,:userId)}]
我尝试过{? = call GET_LOGIN_DET(:userId)}
,call GET_LOGIN_DET(?,:userId)
的各种变体无济于事。我的要求是调用我列出的过程并将结果返回到DAO类中。有人能引导我到达我在这里缺少的东西吗?
答案 0 :(得分:0)
我相信你错误地声明了对存储过程的调用(缺少大括号),试试这个:
@NamedNativeQuery(
name = "getLoginDet",
query = "{call GET_LOGIN_DET(?,:userId)}",
resultClass = Login.class
hints = {@QueryHint(name = "org.hibernate.callable", value = "true")})
@Entity
@Table(name = "T_LOGIN_DET")
public class Login {