【问题标题】:Map an entity to an Native SQL Query将实体映射到本机 SQL 查询
【发布时间】:2011-09-07 07:26:00
【问题描述】:

这是否可以将 SQL Native 查询(而不是表)与 不带注释 的实体映射(使用 XML 配置)??

我知道我可以在数据库中创建一个视图并将此视图映射为解决方法,但我尽量避免使用此解决方案,因为架构是从实体模型自动生成的,我必须创建视图之后手动。

我也知道有注解存在类似@SqlResultSetMapping 的东西,但是我不允许使用注解。

【问题讨论】:

    标签: java hibernate jpa orm ejb


    【解决方案1】:

    要使用 Hibernate 在实体上映射旧表,您可以使用如下 DAO 方法:

    public List<Audit> getAudits(Integer branchId, Integer locationId, Date fromDate, Date toDate, int first, int count, String sortProperty, boolean ascending) {
    
        // columns renamed to match sort properties and hibernate mapping
        StringBuilder query = new StringBuilder(
            "SELECT AUD_Number AS number,"
            + " AUD_Number_REL AS relationNumber,"
            + " AUD_Name_REL AS relationName,"
            + " AUD_Date AS date,"
            + " FROM audit WHERE 1");
            if (branchId!= null) {
                query.append(String.format(" AND AUD_Number_BRN = %s", branchId));
            }
            if (locationId!= null) {
                query.append(String.format(" AND AUD_Nummer_LOC = %s", locationId));
            }
            if (fromDate != null) {
                query.append(String.format(" AND AUD_Date >= %s", DateConverter.dateToSql(fromDate)));
            }
            if (toDate != null) {
                query.append(String.format(" AND AUD_Date <= %s", DateConverter.dateToSql(toDate)));
            }
            query.append(String.format(" ORDER BY %s %s", sortProperty, ascending ? "ASC" : "DESC"));
            query.append(String.format(" LIMIT %s, %s", first, count));
            return (List<Audit>) getSession().createSQLQuery(query.toString()).addEntity(Audit.class).list();
    }
    

    同时在mappings.hbm.xml中:

    <class name="Audit">
        <id name="number" type="integer" />
        <property name="relationNumber" type="integer" />
        <property name="relationName" type="string" />
        <property name="date" type="datetime" />
    </class>
    etc...
    

    为简洁起见,省略 spring 上下文。

    这有帮助吗?

    【讨论】:

      【解决方案2】:

      视图正确的方法。如果您想以某种方式将 SQL 查询存储在数据库中,并定期引用其结果(就好像它是一张表一样),那么这正是对视图的描述。

      所以只需创建一个视图并映射它。

      如果这不能解决您的问题,请编辑您的答案以解释为什么使用视图的解决方案不实用。也许我们可以帮助你。

      【讨论】:

      • 我同意,尽管 Hibernate 支持此功能(将查询映射到实体),但最好使用 SQL 视图代替它。除非您无权修改架构(以添加视图)。
      • 使用视图是否是一个好的解决方案取决于 RDBMS 的类型、您对它的控制级别以及您决定允许额外的映射逻辑层(因此维护复杂性)住在你的数据库中。我会考虑使用 Hibernate 对本机 SQL 查询的支持,很快就会发布一个答案。
      • 今晚我必须发布完整的答案,我无法访问我想在工作中使用的示例代码。同时看到这个:docs.jboss.org/hibernate/core/3.3/reference/en/html/…
      猜你喜欢
      • 2019-07-25
      • 2014-08-26
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      相关资源
      最近更新 更多