2011-12-21 34 views
4

我有一個使用Spring和Hibernate的應用程序。在我的數據庫中,有一些視圖需要在某些實體中加載。所以我想執行原生查詢並加載從視圖中檢索類的任意不等階數據:從JPA /休眠視圖中加載實體

//In my DAO class (@Repository) 
public List<MyClass> findMyEntities(){ 
    Query query = em.createNativeQuery("SELECT * FROM V_myView", MyClass.class); 
    return query.getResultList(); 
} 

和MyClass的具有相同的字段視圖的列名。

的問題是,Hibernate無法識別MyClass的,因爲它不是(它不是爲@Entity註解)

org.hibernate.MappingException: Unknown entity

如果我把MyClass的作爲一個實體的系統將把嘗試創建/更新的實體該實體的表,因爲我已經配置:

<property name="hibernate.hbm2ddl.auto" value="update"/>

所以我接觸到這些問題:

  1. 是否可以禁用「hibernate.hbm2ddl.auto」僅適用於單個實體?
  2. 有沒有辦法將數據從視圖加載到非實體類中?
  3. 如果沒有,在我的情況下將數據從視圖加載到休眠類中的最佳方式是什麼?

感謝

+0

FWIW,其他JPA實現支持不是實體的結果類,JPA 2.0規範對唯一的實體類型沒有提及。 – DataNucleus 2011-12-22 11:49:36

回答

2

您可以使用axtavt solution。您也可以執行您的查詢,並將其轉換爲List<Object[]>,它將明確地返回到List<MyClass>。或者你可以將你的視圖映射爲只讀實體,這可能是最好的解決方案,因爲它可以允許與其他表的關聯,通過JPQL,Criteria等查詢。

在我看來,hibernate.hbm2ddl.auto應該只是用於快速n'髒原型。使用hibernate工具生成允許創建模式的SQL文件,並對其進行修改以刪除視圖的創建。無論如何,如果它設置爲更新,它不應該跳過表創建,因爲它已經存在(作爲一個視圖)?

1

您可以使用AliasToBeanResultTransformer。因爲它是一個Hibernate的相關功能,需要訪問底層的Hibernate Session

return em.unwrap(Session.class) 
     .createSQLQuery("...") 
     .setResultTransformer(new AliasToBeanResultTransformer(MyClass.class)) 
     .list(); 
+0

嘗試它我收到此錯誤:「ERROR org.hibernate.property.BasicPropertyAccessor expected type:java.lang.Long,actual value:java.math.BigInteger」。我是否必須將所有數字都設置爲BigInteger,或者有什麼方法可以將它們投射到Long? (這些數字來自另一個長期價值的實體)。 – Javi 2011-12-21 13:08:04

+0

@Javi:您可以將類的字段聲明爲BigInteger,或者將明確的強制類型轉換爲SQL查詢中的列(而不是'*')。 – axtavt 2011-12-21 14:38:50

7

放在你的類

@Entity 
@Immutable 
@Subselect(QUERY) 
public MyClass {....... } 

的Hibernate執行查詢檢索數據,但不能創建表或視圖。這樣做的缺點是隻能用於讀數。