我正在尝试从 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/