2012-07-09 16 views
6

Bazı alanı nesneleri vardır:Bahar veri alanı nesne miras ve jenerik yöntemler

@Entity 
public class Log { 

} 

@Entity 
public class LogLetter extends Log { 

} 

@Entity 
public class LogAction extends Log { 

} 

ve bana Günlüğü'nün çocuk herkesin ulaşmasını sağlar tek depo sahip olmak istiyorum.

Teorik olarak böyle bir şey yapabilir miyim?

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

ben deyimiyle yapacak başka yaklaşımlar Var:

public interface LogRepository extends CrudRepository<Log, Long> { 

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

} 

ve bu yöntemi çağırın?

+0

Neden sadece 'LogLetterRepository' ve' LogActionRepository' oluşturmaz? Onlar ucuz ve ücretsiz 'findAll' olsun. –

+1

Bu iki etki alanı nesnesi yalnızca bir örnekti, aslında bu nesnelerden 15 tanesine sahibim ve her etki alanı nesnesi için yeni bir depo oluşturmak çok şık değil. –

cevap

2

Ben (özellikle sen from parametreleri kullanamazsınız gerçeği göz önüne alındığında) kutunun dışında mümkün olduğunu sanmıyorum, ama özel bir yöntemi olarak bunu uygulayabilirsiniz (1.4. Custom implementations bakınız):

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

Ayrıca #{#entityName} kullanarak uygulamak olabilir:

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