Diferença entre definir consultas na interface do repositório ou na classe de entidade?
-
20-12-2019 - |
Pergunta
Desculpe se esta é uma pergunta muito nooby/estúpida, mas queria saber se havia alguma diferença, além da implementação, entre definir uma consulta no repositório:
public interface EmployeeRepository<Employee, Integer> {
@Query("select e from Employee e where e.name like :name")
public List<Employee> findByName(@Param("name") String name);
}
e definindo uma consulta na entidade:
@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;
//...
}
Tipo, existem vantagens/desvantagens em qualquer um deles?
Solução
De modo geral recomendamos definir as consultas na interface do repositório por um motivo muito simples:está conceitualmente mais próximo da execução da consulta.Também, @Query
tem algumas opções avançadas quando se trata de consultas adicionais que, por exemplo.precisa ser acionado para implementar a paginação.
No entanto, se você quiser reutilizar a definição de consulta em vários métodos de consulta, usar uma consulta nomeada ainda será uma opção razoável.
O aspecto mais importante da IMO é a consistência entre a equipe ou pelo menos por repositório.Se você começar com consultas nomeadas, não as confunda com @Query
definições, pois isso pode confundir os desenvolvedores ou pelo menos dificultar a compreensão do que está acontecendo.