要调用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更改。我收到一个错误:
无法在查询中执行DML操作
答案 0 :(得分:1)
您必须使用StoredProcedureQuery:
StoredProcedureQuery query = this.em.createStoredProcedureQuery("myfunction");
query.registerStoredProcedureParameter("inparam", String.class, ParameterMode.IN);
query.registerStoredProcedureParameter("outparam", String.class, ParameterMode.OUT);
// set input parameter
query.setParameter("inparam", "Hello);
// call the stored procedure and get the result
query.execute();
String result = (String) query.getOutputParameterValue("sum");
如果您期望一个或多个结果,可以使用
getSingleResult() or getResultList()
类似于Query接口而不是getOutputParameterValue()
在此处查找更多信息: https://www.thoughts-on-java.org/call-stored-procedures-jpa-part-2/
答案 1 :(得分:0)
{
"id": "1",
"Items": [{
"Id": 1,
"Name": "Item #1"
}, {
"Id": 2,
"Name": "Item #2"
}, {
"Id": 3,
"Name": "Item #3"
}, {
"Id": 4,
"Name": "Item #4"
}
]
}