2016-12-15 106 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