Spring数据 - 域对象继承和泛型方法

时间:2012-07-09 09:59:44

标签: java generics jpa spring-data

我有一些域对象:

@Entity
public class Log {

}

@Entity
public class LogLetter extends Log {

}

@Entity
public class LogAction extends Log {

}

我希望只有一个存储库,允许我获取Log的孩子。

我可以从头到尾做这样的事吗?

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);

是否存在其他方法来完成我所描述的内容?

2 个答案:

答案 0 :(得分:2)

我认为开箱即可(特别是考虑到你不能在from中使用参数),但你可以将其作为自定义方法实现(参见1.4. Custom implementations):

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

答案 1 :(得分:1)

您也可以使用#{#entityName}实现它:

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