2012-07-09 27 views
6

我有一些域對象:春數據 - 域對象繼承和泛型方法

@Entity 
public class Log { 

} 

@Entity 
public class LogLetter extends Log { 

} 

@Entity 
public class LogAction extends Log { 

} 

,我想只有一個寶庫,它可以讓我登錄的孩子的。

我可以做teoretically這樣的事情?

public interface LogRepository extends CrudRepository<Log, Long> { 

    @Query("select from ?1) 
    public <T> List<T> getLog(Class<T> clazz); 

} 

,並調用這個方法:

List<LogLetter> logLetters = getLog(LogLetters.class); 

存在任何其他方法做我描述?

+0

爲什麼你不只是創建'LogLetterRepository'和'LogActionRepository'?它們很便宜,你可以免費得到'findAll'。 – 2012-07-09 10:07:36

+1

這兩個領域對象只是一個例子,其實我有這些對象的15和針對每一個域對象創建新的倉庫是不是太優雅。 – 2012-07-09 10:44:08

回答

2

我不認爲這是可能的開箱即用(特別是考慮的事實,你不能在from使用參數),但你可以實現它作爲一個自定義的方法(見1.4. Custom implementations):

public <T> List<T> getLog(Class<T> clazz) { 
    return em.createQuery("from " + clazz.getSimpleName()).getResultList(); 
} 
1

你也可以使用#{#entityName}實現它:

@Query("SELECT o FROM #{#entityName} o where o.attribute1=:attribute1") 
Page<T> findByAttribute1Custom(@Param("attribute1") String attribute1, Pageable pageable);