在存储库接口或实体类中定义查询之间的区别?

chi*_*boi 1 jpa repository named-query spring-data spring-data-jpa

抱歉,这是一个非常笨拙/愚蠢的问题,但是我想知道,除了实现之外,在存储库中定义查询之间是否还有其他区别:

public interface EmployeeRepository<Employee, Integer> {

    @Query("select e from Employee e where e.name like :name")
    public List<Employee> findByName(@Param("name") String name);
}
Run Code Online (Sandbox Code Playgroud)

并在实体中定义查询:

@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;
    //...
}
Run Code Online (Sandbox Code Playgroud)

像是两者都有优点/缺点?

Oli*_*ohm 5

一般而言,我们建议出于一个非常简单的原因在存储库界面上定义查询:从概念上讲,它更接近查询执行。此外,@Query在涉及其他查询(例如需要触发以实现分页)时,还有一些高级选项。

但是,如果要在多种查询方法上重用查询定义,使用命名查询仍然是一个合理的选择。

IMO最重要的方面是团队之间或至少每个回购之间的一致性。如果您从命名查询开始,请不要将它们与@Query定义混为一谈,因为这可能会使开发人员感到困惑,或者至少使它难以理解正在发生的事情。