的實體?映射到本地SQL查詢
我知道我可以在數據庫中創建一個視圖,並將此視圖映射爲解決方法,但我嘗試避免此解決方案,因爲架構是從實體模型自動生成的,而且我必須創建之後手動查看。
我也知道,使用註釋存在類似@SqlResultSetMapping的東西,但我不允許使用註釋。
的實體?映射到本地SQL查詢
我知道我可以在數據庫中創建一個視圖,並將此視圖映射爲解決方法,但我嘗試避免此解決方案,因爲架構是從實體模型自動生成的,而且我必須創建之後手動查看。
我也知道,使用註釋存在類似@SqlResultSetMapping的東西,但我不允許使用註釋。
對於使用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...
爲簡潔起見省略了春天的背景。
這有幫助嗎?
A view is the proper way。如果您想以某種方式將SQL查詢存儲在數據庫中,並定期參考其結果(就像它是一張表一樣),那麼這正是視圖的描述。
所以,只需創建一個視圖並將其映射即可。
如果這樣不能解決您的問題,請編輯您的答案,以解釋爲什麼使用視圖的解決方案不實際。也許我們可以幫助你。
我同意,即使Hibernate支持此功能(將查詢映射到實體),最好在其位置使用SQL視圖。除非您無權修改模式(添加視圖)。 –
謝謝!我編輯了這個問題來澄清這一點。 – edutesoy
使用視圖是否是一個好的解決方案取決於RDBMS的類型,控制級別以及決定允許額外的映射邏輯層(並因此維護複雜性)存在於數據庫中。我會考慮使用Hibernate對原生SQL查詢的支持,稍後會發佈一個答案。 –