【发布时间】:2011-09-07 07:26:00
【问题描述】:
这是否可以将 SQL Native 查询(而不是表)与 不带注释 的实体映射(使用 XML 配置)??
我知道我可以在数据库中创建一个视图并将此视图映射为解决方法,但我尽量避免使用此解决方案,因为架构是从实体模型自动生成的,我必须创建视图之后手动。
我也知道有注解存在类似@SqlResultSetMapping 的东西,但是我不允许使用注解。
【问题讨论】:
标签: java hibernate jpa orm ejb
这是否可以将 SQL Native 查询(而不是表)与 不带注释 的实体映射(使用 XML 配置)??
我知道我可以在数据库中创建一个视图并将此视图映射为解决方法,但我尽量避免使用此解决方案,因为架构是从实体模型自动生成的,我必须创建视图之后手动。
我也知道有注解存在类似@SqlResultSetMapping 的东西,但是我不允许使用注解。
【问题讨论】:
标签: java hibernate jpa orm ejb
要使用 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 上下文。
这有帮助吗?
【讨论】:
视图是正确的方法。如果您想以某种方式将 SQL 查询存储在数据库中,并定期引用其结果(就好像它是一张表一样),那么这正是对视图的描述。
所以只需创建一个视图并映射它。
如果这不能解决您的问题,请编辑您的答案以解释为什么使用视图的解决方案不实用。也许我们可以帮助你。
【讨论】: