2012-07-09 8 views
6

私はいくつかのドメインオブジェクトがあります。春データドメインオブジェクトの継承とジェネリックメソッドは

@Entity 
public class Log { 

} 

@Entity 
public class LogLetter extends Log { 

} 

@Entity 
public class LogAction extends Log { 

} 

をし、私は私がログのチャイルズを取得することができますのみ1つのリポジトリを持っていると思います。

私はteoretically何かこのようなことができますか?

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

は、私が説明したものを行うために、他のアプローチを存在します。

public interface LogRepository extends CrudRepository<Log, Long> { 

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

} 

と、このメソッドを呼び出しますか?

+0

なぜあなたは単に 'LogLetterRepository'と' LogActionRepository'を作成していないのだろうか?彼らは安く、 'findAll'を無料で入手できます。 –

+1

これらの2つのドメインオブジェクトは一例にすぎず、実際にはこれらのオブジェクトが15個あり、すべてのドメインオブジェクトに対して新しいリポジトリを作成することはあまり優雅ではありません。 –

答えて

2

1.4. Custom implementationsを参照してください)私はそれが(特にあなたがfromでパラメータを使用することができないという事実を与えられた)箱から出して可能性はないと思うが、あなたはカスタムメソッドとして実装することができます

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