PostgreSql存储过程和Hibernate

时间:2015-11-03 10:36:59

标签: java database postgresql hibernate stored-procedures

我想在PostgreSQL中创建一个存储过程来进行一些计算并将其返回给My java调用。我尝试过Java-Hibernate中的大多数选项,但无法成功。以下是我的SP。

CREATE OR REPLACE FUNCTION "GET_REPORT"()
RETURNS refcursor AS
$BODY$DECLARE
      ref refcursor; 
BEGIN
OPEN ref FOR Select sum(balance),avg(balance) from sales;
RETURN ref;
END$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION "GET_REPORT"()
OWNER TO postgres;

在Java中如何调用此过程来获取值。 注意:我没有使用hibernate XML文件来调用quires。

请提供Java代码(使用Session)以及程序中的任何更改(如果需要)。

1 个答案:

答案 0 :(得分:1)

正如我在this article中解释的那样,您可以使用JPA StoredProcedureQuery来调用PostgreSQL存储过程或函数

StoredProcedureQuery query = entityManager
    .createStoredProcedureQuery("count_comments")
    .registerStoredProcedureParameter("postId", 
        Long.class, ParameterMode.IN)
    .registerStoredProcedureParameter("commentCount", 
        Long.class, ParameterMode.OUT)
    .setParameter("postId", 1L);

query.execute();

Long commentCount = (Long) query
    .getOutputParameterValue("commentCount");

或者,如果您想使用Hibernate Session

ProcedureCall call = session
    .createStoredProcedureCall("post_comments");

call.registerParameter(1, 
    void.class, ParameterMode.REF_CURSOR);
call.registerParameter(2, 
    Long.class, ParameterMode.IN).bindValue(1L);

Output output = call.getOutputs().getCurrent();

if (output.isResultSet()) {
    List<Object[]> postComments = 
        ((ResultSetOutput) output).getResultList();
    assertEquals(2, postComments.size());
}

就是这样!