0

指定された 2 つの日付範囲に対して MySQL StoredProcedure(EmployeeAbsentReport プロシージャ) があります。MySql Commandpromptで正常に実行されています。Hibernateを使用してこのストアドプロシージャを実行するにはどうすればよいですか、ストアドプロシージャのを呼び出す方法に関する例を1つ見つけましたが、例のプログラムでは、彼は単一のテーブルで作業しました。

手順:

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

プロジェクトの1つで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 に答える