是否可以从休眠动态添加存储过程?

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>();
}

所以我发现了上面存储过程的错误:

  1. 不需要使用 DELIMITER,从 CREATE PROCEDURE 开始
  2. “\n”的使用也不是必须的,但如果使用也不会提示错误。
  3. 不能在同一查询中同时使用 DROP 和 CREATE;它们应该从单独的查询中调用。

干杯!