2012-07-09 1 views
6

ho alcuni oggetti del dominio:primavera dati - oggetto di dominio eredità e metodi generici

@Entity 
public class Log { 

} 

@Entity 
public class LogLetter extends Log { 

} 

@Entity 
public class LogAction extends Log { 

} 

e voglio avere un solo repository che mi permette di ottenere bambino di registro.

Posso fare teoreticamente qualcosa di simile?

public interface LogRepository extends CrudRepository<Log, Long> { 

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

} 

e chiamare questo metodo:

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

esiste altri approcci per fare quello che ho descritto?

+0

Perché non basta creare '' LogLetterRepository' e LogActionRepository'? Sono economici e ottieni 'findAll' gratuitamente. –

+1

Questi due oggetti di dominio erano solo un esempio, in realtà ho 15 di questi oggetti e la creazione di un nuovo repository per ogni oggetto dominio non è troppo elegante. –

risposta

2

Non credo sia possibile fuori dalla scatola (soprattutto in considerazione del fatto che non è possibile utilizzare i parametri in from), ma è possibile implementare come un metodo personalizzato (vedi 1.4. Custom implementations):

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

si potrebbe anche implementare utilizzando #{#entityName}:

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