gpt4 book ai didi

java - 使用 Hibernate 执行 Oracle 存储过程

转载 作者:行者123 更新时间:2023-12-01 09:07:13 25 4
gpt4 key购买 nike

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

我已经搜索并阅读了 SO、Hibernate 社区/文档( native SQL 章节)链接中的所有相关链接,并尝试了这些建议,但不知何故无法让它们工作。以下是我的资料来源 - 我只包含相关部分。

我的实体类。我为 PL/SQL OUT 参数保留了第一个参数。

登录.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 。第一个参数是OUT REFCURSOR根据 Hibernate 规范

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 类:我仅绑定(bind)命名参数,忽略第一个?在命名查询中。

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 类中。有人可以引导我找到我到底缺少什么吗?

最佳答案

我相信您错误地声明了对存储过程的调用(缺少大括号),请尝试以下操作:

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

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

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