gpt4 book ai didi

java - 使用JPA执行数据库功能

转载 作者:行者123 更新时间:2023-11-30 06:20:45 24 4
gpt4 key购买 nike

要调用 Oracle 数据库函数,我只需编写

final Query query = entityManager.createNativeQuery(
"select myfunction(?) from dual"
);
query.setParameter(1, "value");
Object rv = query.getSingleResult();

只要被调用的函数不执行任何 dml 操作,此方法就有效。否则我必须执行类似的事情

    {? = call myfunction(?)}

不幸的是,我无法注册任何 OUT 参数,因此我无法使该语句起作用。如何在不使用普通 JDBC 的情况下实现这一目标?

<小时/>

编辑:

这个问题具有误导性。我想获取 Oracle 数据库中函数(不是存储过程)的结果。没有 OUT 参数。该函数可能如下所示:

CREATE OR REPLACE FUNCTION myfunction(value IN VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
UPDATE foo SET bar = 'foobar'
WHERE id = 1;

RETURN 'test';
END myfunction;

Calling an oracle function from JPA的答案没有解决我的问题,因为我的函数内部有 dml 更改。我收到错误:

cannot perform a DML operation inside a query

最佳答案

  • 当函数中存在任何 DML 语句时,Select Query 将不起作用。
    如果没有 DML 语句,那么 SELECT QUERY 是最好且最有效的继续方法。
  • 如果有DML语句,那么你必须使用CallableStatement接口(interface)。
    当我们在项目中使用 JDBC 时,这是相当先进的,但对于 Spring 项目,即使用 JPA,我们将需要从 EntityManager 和 ReturningWork 获取 session 。
  Session session = entityManager.unwrap(Session.class);
CallableStatement callableStatement = session.doReturningWork(new ReturningWork<CallableStatement>() {
@Override
public CallableStatement execute(Connection connection) throws SQLException {
CallableStatement function = connection.prepareCall(
"{ ? = call package_name.function_name(?,?) }");
function.registerOutParameter(1, Types.INTEGER);
function.setLong(2, 56);
function.setString(3,"some text");

function.execute();
return function;
}
});

try {
return callableStatement.getBigDecimal(1);
} catch (SQLException e) {
e.printStackTrace();
return null;
}

关于java - 使用JPA执行数据库功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48206058/

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