【问题标题】:Difference between defining queries in the repository interface or entity class?在存储库接口或实体类中定义查询之间的区别?
【发布时间】:2014-09-20 15:11:08
【问题描述】:

对不起,如果这是一个非常愚蠢/愚蠢的问题,但我想知道除了实现之外,在存储库中定义查询之间是否有任何区别:

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

这两者各有优缺点吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢奥利弗的回复!如果有机会,您能否也看看我关于 spring data jpa 的分页的其他问题之一,以确认我选择的答案?谢谢大声笑link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    相关资源
    最近更新 更多