在存储库接口或实体类中定义查询之间的区别?
-
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
当涉及到其他查询时,有一些高级选项,例如需要触发才能实现分页。
但是,如果您想在多个查询方法上重复使用查询定义,那么使用命名查询仍然是一个合理的选择。
IMO 最重要的方面是团队之间或至少每个存储库的一致性。如果您从命名查询开始,请不要将它们与 @Query
定义,因为这可能会让开发人员感到困惑,或者至少让他们更难理解正在发生的事情。
不隶属于 StackOverflow