Разница между определением запросов в интерфейсе репозитория или классе сущности?
-
20-12-2019 - |
Вопрос
Извините, если это очень нубский/глупый вопрос, но мне было интересно, есть ли какая-либо разница, помимо реализации, между определением запроса в репозитории:
public interface EmployeeRepository<Employee, Integer> {
@Query("select e from Employee e where e.name like :name")
public List<Employee> findByName(@Param("name") String name);
}
и определение запроса в сущности:
@Entity
@NamedQuery(name="Employee.findByName", query="select e from Employee e where e.name like :name")
public class Employee {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
//...
}
Есть ли преимущества/недостатки у каждого из них?
Решение
Вообще говоря, мы рекомендуем определять запросы в интерфейсе репозитория по очень простой причине:концептуально это ближе к выполнению запроса.Также, @Query
имеет несколько расширенных опций, когда дело доходит до дополнительных запросов, например.необходимо запустить для реализации нумерации страниц.
Однако если вы хотите повторно использовать определение запроса для нескольких методов запроса, использование именованного запроса по-прежнему является разумным вариантом.
Самый важный аспект, по моему мнению, — это последовательность либо внутри команды, либо, по крайней мере, в каждом репо.Если вы начинаете с именованных запросов, не путайте их с @Query
определения, поскольку это может сбить с толку разработчиков или, по крайней мере, затруднить понимание того, что происходит.