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

时间:2014-07-29 09:27:08

标签: jpa repository spring-data spring-data-jpa named-query

很抱歉,如果这是一个非常愚蠢/愚蠢的问题,但我想知道在存储库中定义查询之间是否存在任何差异,除了实现之外:

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;
    //...
}

哪一个都有优点/缺点?

1 个答案:

答案 0 :(得分:4)

一般来说,我们建议在存储库接口定义查询的原因非常简单:它在概念上更接近查询执行。此外,@Query在涉及其他查询时也有一些高级选项。需要被触发来实施分页。

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

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