ans*_*ste 4 java hibernate jpa entitymanager
要调用 Oracle 数据库函数,我只需编写
final Query query = entityManager.createNativeQuery(
"select myfunction(?) from dual"
);
query.setParameter(1, "value");
Object rv = query.getSingleResult();
Run Code Online (Sandbox Code Playgroud)
只要被调用的函数不执行任何 dml 操作,此操作就有效。否则我必须执行类似的事情
{? = call myfunction(?)}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我无法注册任何 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;
Run Code Online (Sandbox Code Playgroud)
Calling an oracle function from JPA 的答案并不能解决我的问题,因为我的函数内部存在 dml 更改。我收到错误:
无法在查询内执行 DML 操作
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18924 次 |
| 最近记录: |