2011-09-07 54 views
0

的實體?映射到本地SQL查詢

我知道我可以在數據庫中創建一個視圖,並將此視圖映射爲解決方法,但我嘗試避免此解決方案,因爲架構是從實體模型自動生成的,而且我必須創建之後手動查看。

我也知道,使用註釋存在類似@SqlResultSetMapping的東西,但我不允許使用註釋。

回答

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... 

爲簡潔起見省略了春天的背景。

這有幫助嗎?

1

A view is the proper way。如果您想以某種方式將SQL查詢存儲在數據庫中,並定期參考其結果(就像它是一張表一樣),那麼這正是視圖的描述。

所以,只需創建一個視圖並將其映射即可。

如果這樣不能解決您的問題,請編輯您的答案,以解釋爲什麼使用視圖的解決方案不實際。也許我們可以幫助你。

+0

我同意,即使Hibernate支持此功能(將查詢映射到實體),最好在其位置使用SQL視圖。除非您無權修改模式(添加視圖)。 –

+0

謝謝!我編輯了這個問題來澄清這一點。 – edutesoy

+0

使用視圖是否是一個好的解決方案取決於RDBMS的類型,控制級別以及決定允許額外的映射邏輯層(並因此維護複雜性)存在於數據庫中。我會考慮使用Hibernate對原生SQL查詢的支持,稍後會發佈一個答案。 –