2016-12-15 74 views
0

我一直在尝试使用Hibernate执行Oracle存储过程。这不是为了生产 - 而是为了我正在追求的Java源代码解析项目。简而言之,我无法从Oracle存储过程中返回一个值。使用Hibernate执行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 { 

甲骨文存储过程:GET_LOGIN_DET.sql。第一个参数是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> 

但是,我总是最后休眠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

我相信你已经声明不正确调用存储过程(大括号丢失),试试这个:

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

这完美的作品。关键是QueryHint,没有它,它期望两个参数。谢谢。 – user2795418