2012-07-09 11 views
6

que tienen algunos objetos de dominio:primavera de datos - objeto de dominio herencia y métodos genéricos

@Entity 
public class Log { 

} 

@Entity 
public class LogLetter extends Log { 

} 

@Entity 
public class LogAction extends Log { 

} 

y quiero tener un solo repositorio de lo que me permite obtener niño de registro.

¿Puedo hacer teóricamente algo como esto?

public interface LogRepository extends CrudRepository<Log, Long> { 

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

} 

y llamar a este método:

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

existe ningún otros enfoques para hacer lo que he descrito?

+0

Por qué no le acaba de crear '' LogLetterRepository' y LogActionRepository'? Son baratos y obtienes 'findAll' gratis. –

+1

Estos dos objetos de dominio fueron solo un ejemplo, en realidad tengo 15 de estos objetos y la creación de un nuevo repositorio para cada objeto de dominio no es demasiado elegante. –

Respuesta

2

No creo que sea posible fuera de la caja (especialmente teniendo en cuenta el hecho de que no se puede utilizar parámetros en from), pero se puede aplicar como un método personalizado (ver 1.4. Custom implementations):

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

también podría hacerlo operativo #{#entityName}:

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