java - 如何解决Hibernate和MySQL中存储函数调用的返回值问题?

标签 java mysql spring hibernate jboss

我正在尝试从 hibernate 中的 MySQL 存储过程获取数据。我有一个 custom_query.xml 文件和 DAO.java 文件

MySQL 中的存储过程:

CREATE DEFINER=`root`@`localhost` PROCEDURE `SET_NETWORK`(
    IN TO_CREATE BIGINT,
    OUT CREATED BIGINT
)
BEGIN
     SET CREATED = (SELECT COUNT(VNR.ID) FROM NETWORK_TABLE VNR);
    WHILE (CREATED < TO_CREATE) DO
      INSERT INTO NETWORK_TABLE (ACTIVE) VALUES(0);
      SET CREATED = CREATED + 1;
    END WHILE;
END

我正在尝试使用以下代码从 hibernate 执行 SQL 查询:

 <sql-query name="Network_getFreeNetworksForDomain" read-only="false" callable="true" cacheable="false"><![CDATA[
        { ? = CALL SET_NETWORK(?,?) }
    ]]></sql-query>

在 DAO.java 文件中,我使用 Network_getFreeNetworksForDomain 来调用 SQL 查询:

@Override
    @Transactional(readOnly = true)
    @SuppressWarnings({"unchecked"})
    public List<Network> getNetworksForDomain(Domain domain) throws DataAccessException {
        Long domainId = domain.getId();
        if (domainId == null) {
            domainId = 0L;
        }
        return (List<Network>) getSession().getNamedQuery("Network_getFreeNetworksForDomain")
                .setLong("dId", domainId).list();
    }

但是我在将文件部署到 JBoss 时收到以下排泄

 Caused by: java.sql.SQLException: Can't set IN parameter for return value of stored function call.
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055) [mysql-connector-java-5.1.6.jar:]
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) [mysql-connector-java-5.1.6.jar:]
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926) [mysql-connector-java-5.1.6.jar:]
        at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3294) [mysql-connector-java-5.1.6.jar:]
        at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3272) [mysql-connector-java-5.1.6.jar:]
        at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3314) [mysql-connector-java-5.1.6.jar:]
        at com.mysql.jdbc.PreparedStatement.setLong(PreparedStatement.java:3330) [mysql-connector-java-5.1.6.jar:]
        at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.setLong(WrappedPreparedStatement.java:229)
        at com.dao.entity.NetworkHibernateDAO$1.createCallableStatement(NetworkHibernateDAO.java:169) [dao-impl-6.4.0.jar:]
        at com.dao.hibernate.transaction.HibernateUtils.execute(HibernateUtils.java:106) [dao-impl-6.4.0.jar:]
        at com.dao.hibernate.transaction.HibernateUtils$1.doInConnection(HibernateUtils.java:74) [dao-impl-6.4.0.jar:]
        at com.dao.hibernate.transaction.HibernateUtils$2.execute(HibernateUtils.java:91) [dao-impl-6.4.0.jar:]
        at org.hibernate.impl.SessionImpl.doWork(SessionImpl.java:1987) [hibernate-core-3.5.6-Final.jar:3.5.6-Final]
        ... 51 more

 Caused by: org.springframework.orm.hibernate3.HibernateJdbcException: JDBC exception on Hibernate data access: SQLException for SQL [???]; SQL state [S1009]; error code [0]; error executing work; nested exception is org.hibernate.exception.GenericJDBCException: error executing work

有什么建议吗?如何解决此类错误?

更新:

在 DB2 和 PostgreSQL 中,这可以正常工作

 <sql-query name="Network_getFreeNetworksForDomain" read-only="false" callable="true" cacheable="false"><![CDATA[
            { ? = CALL SET_NETWORK(?) }
        ]]></sql-query>

但是得到了上面提到的相同异常。所以我在我的存储过程中添加了带有两个参数的 CALL SET_NETWORK(?,?)

最佳答案

{ ? = CALL SET_NETWORK(?,?) }

看来您需要 2 个参数,但您只提供了一个

.setLong("dId", domainId)

我不确定你的代码是否能够找到“dId”参数,也许你应该使用索引,你可以有一些示例 in the official documentation

关于java - 如何解决Hibernate和MySQL中存储函数调用的返回值问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47630901/

相关文章:

MySQL 在多个表上选择联接

php - 仅搜索部分数据库字符串时打印数据库字符串(通过 PHP 语句)

spring - 注释驱动配置spring时如何为bean设置init-method?

java - Spring - 如何在集成测试中将图像插入数据库

oracle - 如何加速 Hibernate 应用程序的启动?

java - 对于实现 Iterable 的类,Android 上下文不可序列化的困境

php - 迭代查询并将数字分组

java - JSF/莫贾拉 2.0.2 : ui:repeat is totally broken when updating via AJAX

java - jps、jinfo、jstat、jmap、jstack是如何获取本地Java进程信息的?

java - 在java中输出匹配的捕获组