是否可以从休眠动态添加存储过程?
Is it possible to add Stored procedure dynamically from hibernate?
我想使用休眠从我的 Java 代码中动态添加存储过程。
我做了以下操作,但这经常导致错误提示“
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use
我做错了什么?
String dnyLockProcedure = "DELIMITER ||"
+"\n DROP PROCEDURE IF EXISTS `dyn_lock`; "
+"\n CREATE PROCEDURE `dyn_lock`(IN `query` TEXT, IN `lock_name` CHAR(64), IN `timeout` TINYINT UNSIGNED)"
-- PROCEDURE HERE
+"\n END;"
+"\n || "
+"\n DELIMITER ;";
Query queryTest = mEntityManager.createNativeQuery(dnyLockProcedure);
queryTest.executeUpdate();
编辑:下面是整个过程:
String dnyLockProcedure ="DROP PROCEDURE IF EXISTS `dyn_lock`; "
+" CREATE PROCEDURE `dyn_lock`(IN `query` TEXT, IN `lock_name` CHAR(64), IN `timeout` TINYINT UNSIGNED)"
+" NO SQL "
+" LANGUAGE SQL "
+" COMMENT 'Get a lock for dyn cursor' "
+" BEGIN "
+" DECLARE lock_res TINYINT UNSIGNED;"
+" DECLARE CONTINUE HANDLER"
+" FOR SQLEXCEPTION"
+" SIGNAL SQLSTATE VALUE '45000' SET"
+" MESSAGE_TEXT = '[dyn_lock] Dynamic SQL returned an error';"
+" SET lock_res = GET_LOCK(`lock_name`, IFNULL(`timeout`, 5));"
+" IF (lock_res IS NULL) THEN"
+" SIGNAL SQLSTATE VALUE '45000' SET"
+" MESSAGE_TEXT = '[dyn_lock] Could not acquire lock: Unknown error';"
+" ELSEIF (lock_res = 0) THEN"
+" SIGNAL SQLSTATE VALUE '45000' SET"
+" MESSAGE_TEXT = '[dyn_lock] Could not acquire lock: Timeout expired';"
+" END IF;"
+" SET @dyn_sql = CONCAT('CREATE OR REPLACE VIEW `', lock_name, '` AS ', query, ';');"
+" PREPARE stmt_dyn_view FROM @dyn_sql;"
+" EXECUTE stmt_dyn_view;"
+" DEALLOCATE PREPARE stmt_dyn_view;"
+" END;";
尝试使用此代码。希望你的问题能得到解决。
public final List<CoverageEntity> getCMDataTable(final String countryCode, final CoverageBean coverageBean) {
getHibernateTemplate().execute(new HibernateCallback() {
public (List) doInHibernate(final Session session)throws HibernateException, SQLException {
// Query query = getQuery(countryCode, coverageBean , session);
Query query = session.createSQLQuery("call ASPECT.SC_CVRG_SEARCH('99991',null,null,null,null,null,null)").addEntity(CoverageEntity.class);
System.out.println(ToStringBuilder.reflectionToString(query.list(),ToStringStyle.MULTI_LINE_STYLE));
return query.query.list();
}
})
;
return new ArrayList<CoverageEntity>();
}
所以我发现了上面存储过程的错误:
- 不需要使用 DELIMITER,从 CREATE PROCEDURE 开始
- “\n”的使用也不是必须的,但如果使用也不会提示错误。
- 不能在同一查询中同时使用 DROP 和 CREATE;它们应该从单独的查询中调用。
干杯!
我想使用休眠从我的 Java 代码中动态添加存储过程。 我做了以下操作,但这经常导致错误提示“
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use
我做错了什么?
String dnyLockProcedure = "DELIMITER ||"
+"\n DROP PROCEDURE IF EXISTS `dyn_lock`; "
+"\n CREATE PROCEDURE `dyn_lock`(IN `query` TEXT, IN `lock_name` CHAR(64), IN `timeout` TINYINT UNSIGNED)"
-- PROCEDURE HERE
+"\n END;"
+"\n || "
+"\n DELIMITER ;";
Query queryTest = mEntityManager.createNativeQuery(dnyLockProcedure);
queryTest.executeUpdate();
编辑:下面是整个过程:
String dnyLockProcedure ="DROP PROCEDURE IF EXISTS `dyn_lock`; "
+" CREATE PROCEDURE `dyn_lock`(IN `query` TEXT, IN `lock_name` CHAR(64), IN `timeout` TINYINT UNSIGNED)"
+" NO SQL "
+" LANGUAGE SQL "
+" COMMENT 'Get a lock for dyn cursor' "
+" BEGIN "
+" DECLARE lock_res TINYINT UNSIGNED;"
+" DECLARE CONTINUE HANDLER"
+" FOR SQLEXCEPTION"
+" SIGNAL SQLSTATE VALUE '45000' SET"
+" MESSAGE_TEXT = '[dyn_lock] Dynamic SQL returned an error';"
+" SET lock_res = GET_LOCK(`lock_name`, IFNULL(`timeout`, 5));"
+" IF (lock_res IS NULL) THEN"
+" SIGNAL SQLSTATE VALUE '45000' SET"
+" MESSAGE_TEXT = '[dyn_lock] Could not acquire lock: Unknown error';"
+" ELSEIF (lock_res = 0) THEN"
+" SIGNAL SQLSTATE VALUE '45000' SET"
+" MESSAGE_TEXT = '[dyn_lock] Could not acquire lock: Timeout expired';"
+" END IF;"
+" SET @dyn_sql = CONCAT('CREATE OR REPLACE VIEW `', lock_name, '` AS ', query, ';');"
+" PREPARE stmt_dyn_view FROM @dyn_sql;"
+" EXECUTE stmt_dyn_view;"
+" DEALLOCATE PREPARE stmt_dyn_view;"
+" END;";
尝试使用此代码。希望你的问题能得到解决。
public final List<CoverageEntity> getCMDataTable(final String countryCode, final CoverageBean coverageBean) {
getHibernateTemplate().execute(new HibernateCallback() {
public (List) doInHibernate(final Session session)throws HibernateException, SQLException {
// Query query = getQuery(countryCode, coverageBean , session);
Query query = session.createSQLQuery("call ASPECT.SC_CVRG_SEARCH('99991',null,null,null,null,null,null)").addEntity(CoverageEntity.class);
System.out.println(ToStringBuilder.reflectionToString(query.list(),ToStringStyle.MULTI_LINE_STYLE));
return query.query.list();
}
})
;
return new ArrayList<CoverageEntity>();
}
所以我发现了上面存储过程的错误:
- 不需要使用 DELIMITER,从 CREATE PROCEDURE 开始
- “\n”的使用也不是必须的,但如果使用也不会提示错误。
- 不能在同一查询中同时使用 DROP 和 CREATE;它们应该从单独的查询中调用。
干杯!