2012-07-09 29 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);