繁体   English   中英

带有联接和临时表的Hibernate StoredProcedure

[英]Hibernate StoredProcedure with joins and Temporary table

对于给定的两个日期范围,我有一个MySQL StoredProcedure(EmployeeAbsentReport Procedure)。 已在MySql Commandprompt上成功运行。 我如何使用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查询?

按照我在一个项目中使用的通用框架方法来调用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中执行,从性能的角度来看也更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM