0

对于给定的两个日期范围,我有一个 MySQL StoredProcedure(EmployeeAbsentReport Procedure)。在 MySql 命令提示符上成功运行。如何使用 Hibernate 运行此存储过程,我找到了一个有关如何调用存储过程示例的示例,但在示例程序中,他使用了一个表。

程序:

DELIMITER $$

DROP PROCEDURE IF EXISTS `AbsentReportproc`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `AbsentReportproc`(IN _fromdate DATETIME, IN _todate DATETIME)
BEGIN 
    CREATE TEMPORARY TABLE daterange25 (dte DATE); 

    SET @counter := 0;
    WHILE (@counter < DATEDIFF(DATE(_todate), DATE(_fromdate))) DO 
        INSERT INTO daterange25 VALUES (DATE_ADD(_fromdate, INTERVAL @counter:=@counter + 1 DAY));
    END WHILE;

SELECT tp.EMPCODE,tp.NAME,tp.DEPARTMENT, Group_Concat(d.dte order by d.dte SEPARATOR '\n')AbsentDate, COUNT(tp.EMPCODE) Totalnoofabsentdates
FROM Master tp
JOIN daterange25 d
LEFT JOIN Transactions tpt ON (tp.EMPCODE = tpt.empcode) AND DATE(S_DateTime) = d.dte
WHERE tpt.empcode IS NULL
GROUP BY tp.EMPCODE;   

    DROP TABLE daterange25;
END$$

DELIMITER ;

如何使用带有连接(包括临时表)的 Hibernate 调用存储过程并在 XML 映射文件中编写 sql-query?

4

1 回答 1

0

遵循我在一个项目中使用的通用框架方法来调用 MySQL 数据库的存储过程:

@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
    public <T> List<T> executeSP(final String spName,
            final String[] parameterNames, final String[] parameterValues,
            final String[] resultColumnNames, final int offset, final int size,
            final Class<T> returnType) {
        validateParams(parameterNames, parameterValues);
        return (List<T>) hibernateTemplate
                .execute(new HibernateCallback<List<T>>() {
                    @SuppressWarnings("unchecked")
                    public List<T> doInHibernate(final Session session) {
                        SQLQuery query = session.createSQLQuery("call "
                                + spName);
                        if (returnType != null) {
                            query.addEntity(returnType);
                        }
                        setQueryParams(parameterNames, parameterValues, query);
                        setResultColumnNames(resultColumnNames, query);
                        if (offset >= 0) {
                            query.setFirstResult(offset);
                        }
                        if (size > 0) {
                            query.setMaxResults(size);
                        }
                        return query.list();
                    }
                });
    }

接下来,我建议请仅将临时表加入存储过程,而不是将其加入 SP,如果在 SP 中执行,那么从性能角度来看也更好。

于 2013-01-07T08:53:36.677 回答