java - 如何从 Hibernate 调用 MySQL 存储过程

标签 java mysql database hibernate stored-procedures

我正在尝试从使用 MySQL 的 Java 应用程序调用 MySQL 存储过程。下面是 DAO 中我用来调用存储过程“insertComm”的部分

String opt="REFUND";
        Query query = this.getSession().createSQLQuery("CALL insertComm (:remitNo,     :opt)")
           .setParameter("remitNo", remitNo)
               .setParameter("opt", opt);
opt=query.toString();
hemappLogger.info(opt);

但是当我查询数据库并检查时,存储过程还没有被执行。 'opt' 值显示为 SQLQueryImpl(CALL insertComm (:remitNo, :opt))

参数没问题,应用程序也没有显示错误。我看不到我错过了什么。

最佳答案

假设您有一个输出基本类型的简单存储过程:

CREATE PROCEDURE count_comments (
   IN postId INT, 
   OUT commentCount INT
) 
BEGIN
    SELECT COUNT(*) INTO commentCount 
    FROM post_comment  
    WHERE post_comment.post_id = postId; 
END

您可以使用 JPA StoredProcedureQuery 调用此存储过程:

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");

如果您的存储过程返回一个 REFCURSOR 或一个 TABLE 结果:

CREATE PROCEDURE post_comments(IN postId INT) 
BEGIN
    SELECT *  
    FROM post_comment   
    WHERE post_id = postId;  
END

您需要按如下方式调用存储过程:

StoredProcedureQuery query = entityManager
    .createStoredProcedureQuery("post_comments");
query.registerStoredProcedureParameter(1, Long.class, ParameterMode.IN);
 
query.setParameter(1, 1L);
 
List<Object[]> postComments = query.getResultList();

对于数据库函数,返回结果集而不是将其放在 OUT 变量中:

CREATE FUNCTION fn_count_comments(postId integer)
RETURNS integer
DETERMINISTIC 
READS SQL DATA 
BEGIN
    DECLARE commentCount integer; 
    SELECT COUNT(*) INTO commentCount 
    FROM post_comment  
    WHERE post_comment.post_id = postId; 
    RETURN commentCount; 
END

Hibernate 4.x 和 5.x API 对您没有帮助,您必须改用 JDBC:

int commentCount = session.doReturningWork(connection -> {
    try (CallableStatement function = connection.prepareCall(
            "{ ? = call fn_count_comments(?) }")) {
        function.registerOutParameter(1, Types.INTEGER);
        function.setInt(2, 1);
        function.execute();
        return function.getInt(1);
    }
});

关于java - 如何从 Hibernate 调用 MySQL 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14351589/

相关文章:

database - SQLite 合并重复项

database - 规范化过多与过少,例子?

mongodb - 如何在mongodb中创建关系?

java - 我的 Insert Into 语句不起作用

java - 具有 2 个用户角色的 tomcat 上的 j_security_check

mysql - FastReport 中的表别名(DataField 属性)

MySQL 将表 1 中的多个列连接到表 2 上的多个列

java - 以编程方式将 Java 应用程序添加到启动

java - 如何在 OpenScript - Oracle Application Testing Suite 中传递运行时参数?

mysql - 如何将字符串作为查询参数传递