[英]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.