将实体映射到本机SQL查询

时间:2011-09-07 07:26:00

标签: java hibernate jpa orm ejb

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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...

为简洁省略弹簧背景。

这有帮助吗?

相关问题