我一直在嘗試使用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類。有人能讓我知道我錯過了什麼嗎?
這完美的作品。關鍵是QueryHint,沒有它,它期望兩個參數。謝謝。 – user2795418