如何为存储过程编写 Hibernate 映射文件?

Posted

技术标签:

【中文标题】如何为存储过程编写 Hibernate 映射文件?【英文标题】:How to write Hibernate mapping file for a stored procedure? 【发布时间】:2013-01-16 07:05:56 【问题描述】:

我有一个 mysql 存储过程,它接受两个输入日期并返回 EmpCodeNameDepartmentEmployee_Absent_DateTotal_No_OF_Days

存储过程(两个给定日期范围内的员工缺勤报告):

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 := -1;
    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 test_prefixmaster tp
JOIN daterange25 d
LEFT JOIN test_prefixtransactions 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 version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="edu.model.Master" table="test_prefixmaster">
        <id name="empcode" column="EMPCODE" length="10" ></id>
        <property name="dept">
            <column name="DEPARTMENT" length="30" />
        </property>
        <property name="empname">
            <column name="NAME" length="30" />
        </property>
    </class>
    <sql-query name="AbsentReportproc" callable="true">
    <return alias="master" class="edu.model.Master">
        <return-property name="empcode" column="EMPCODE" />
        <return-property name="dept" column="DEPARTMENT" />
       <return-property name="empname" column="NAME" /> 

       </return>
        <![CDATA[CALL AbsentReportproc(:_fromdate,:_todate)]]>
  </sql-query>
</hibernate-mapping>

这是我的测试类(主):

public static void main()
Query query = session.getNamedQuery("AbsentReportproc");
            query.setParameter("_fromdate", "2012-11-22");
            query.setParameter("_todate", "2012-11-23");
            List absentiesList=new ArrayList();
             absentiesList = query.list();

            for (int i = 0; i < absentiesList.size(); i++) 

                Master master = (Master) absentiesList.get(i);

        System.out.println("Employee Code:::" + master.getEmpcode());
        System.out.println("Employee Name:::"master.getEmpname());
   System.out.println("Employee Department:::" + master.getDept());         

            

当我运行我的 Hibernate 代码时,我能够成功打印员工代码、姓名和部门

但我的实际要求是如何映射列并从名为daterange25 的临时表中打印 d.dte 的值?我应该为我的临时表创建一个 Pojo 吗?

谢谢

【问题讨论】:

【参考方案1】:

我认为没有办法将 SP 的结果直接映射到实体。您应该编写并实例化您自己的 pojo,或者是的,您可以将实体映射到您的 SP 存储结果的临时表。

【讨论】:

【参考方案2】:

您可以根据 SP 结果的结构创建 POJO,并在 hibernate 映射 XML 中映射其列,而无需指定表名。不需要返回属性标签。

【讨论】:

以上是关于如何为存储过程编写 Hibernate 映射文件?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate - 如何为整数类型提供正确的映射?

如何用 JPA/Hibernate 映射 XMLType

如何为连接表中的其他属性创建多对多 Hibernate 映射?

Java/Hibernate:如何为复杂的 SQL 编写 DAO 代码

hibernate 中的ORM是如何与数据库实现存储和查询的

如何为具有多种父类型的子场景编写 EF 代码优先映射