使用JPA执行数据库功能

时间:2018-01-11 11:32:39

标签: java hibernate jpa entitymanager

要调用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操作

2 个答案:

答案 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)

  • 该函数中有任何DML语句时,“选择查询”将不起作用。
    如果没有DML语句,则SELECT QUERY是进行操作的最佳和有效方法。
  • 如果有DML语句,则必须使用CallableStatement接口。
    当我们在项目中使用JDBC时,这是相当向前的,但是对于Spring项目,即使用JPA,我们将需要从EntityManager和ReturningWork获得会话。
{
    "id": "1",
    "Items": [{
            "Id": 1,
            "Name": "Item #1"
        }, {
            "Id": 2,
            "Name": "Item #2"
        }, {
            "Id": 3,
            "Name": "Item #3"
        }, {
            "Id": 4,
            "Name": "Item #4"
        }
    ]
}