2017-02-23 45 views
1

我的應用程序有超過250個表,每個表都有ID和名稱列。我試圖將我們的應用程序從hibernate 3遷移到Spring-JPA 4.3,並且使用hibernate 5+。具有多個實體查找器的常見spring jpa存儲庫

在我目前的休眠層我有(選項1):

public class DAO 
{ 
    private Session session; 

    public DAO(Session session) 
    { 
     this.session=session; 
    } 

    public EntityA findById(String id) 
    { 
     //implementation 
     return entityA; 
    } 
    public EntityB findByName(String name) 
    { 
     //implementation 
     return entityB; 
    } 
    public EntityC findByIdAndName(String id, String name) 
    { 
     //implementation 
     return entityC; 
    } 
} 

早在天我可以做更多的泛型方法如下,但是我不想,如果我要重新初始化這個類通過ID獲取10個不同的實體。

public class DAO<T> 
{ 
    public T findById(String id) 
    { 
     //implementation 
     return T; 
    } 
    public T findByName(String name) 
    { 
     //implementation 
     return T; 
    } 
    public T findByIdAndName(String id, String name) 
    { 
     //implementation 
     return T; 
    } 
} 

現在我怎麼能在Spring-JPA中實現這一點。所以,如果我需要通過ID獲得10個不同的實體,我不想初始化10個存儲庫,我想有一個存儲庫,我可以使用它來獲取任何我想要byId或byName或byIDAndName的實體。我可以使用JdbcTemplate輕鬆完成,但這意味着它可能無法通過JPA/Hibernate緩存機制進行跟蹤。

那麼,怎樣才能做到以下在一個JPA庫:

{ 
    @Query("from EntityA where id=?1") 
    EntityA findEntityAById(String id); 

    @Query("from EntityB where name=?1") 
    EntityB findEntityBById(String name); 

    @Query("from EntityC where id=?1 and name=?2") 
    EntityC findEntityCById(String id,String name); 
} 
+0

而不是Spring JPA我假設您的意思是Spring Data JPA?你不能......只需編寫你自己的實現... –

回答

1

你應該能夠創建一個超類(ES)具有共同的屬性,將其標記爲@MappedSuperclass並創建一個存儲庫作爲@NoRepositoryBean的超類。你只需要爲你的結果做一些投射。 請參閱this answer

相關問題