2016-09-05 2 views
0

Есть ли способ фильтрации по классу из базового класса?фильтр репозитория java spring по производному классу

например У меня есть Animal.class, и у меня есть AnimalRepository. я хочу найти животное по типу производного класса, так что-то вроде:

Animal animalRepository.findByDerivedClass(Class clazz); 

В то же время я не заранее, какой производный класс это. Это может быть Cat, Dog или new, о котором я еще не знаю. Является ли это возможным?

ответ

1

Да, к примеру, вы можете создать отборный с спящим режимом по типу класса:

List<Animal> animal = (List<Animal>) getSession().createCriteria(Class clazz).list(); 
+0

Я надеялся на решение с репозиториями, но это также выглядит многообещающим, попробует его. – Sarief

0

Принятого ответ этилированного меня критериям использование (репозитории не могут сделать, поэтому пришлось писать специальный метод для хранилища , что означает использование критериев)

Также обратите внимание, что этот метод, если он используется в репозитории, должен быть объявлен в соответствии с соглашением jpa.

public <T extends Animal> List<T> findByDerivedClass(Class<T> clazz) { 
    CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
    CriteriaQuery<T> cq = cb.createQuery(clazz); 
    Root<T> root = cq.from(clazz); // we pass clazz here again, because magic... 
    cq.select(root); 
    return entityManager.createQuery(cq).getResultList(); 
}