【问题标题】:Spring JPA @Query Annatotion disadvantagesSpring JPA @Query Anatotion 的缺点
【发布时间】:2020-05-16 10:06:42
【问题描述】:

嗨,我使用 spring jpa 在我的 spring boot 项目中访问我的数据。我想知道 jpa 中的 @Query annatotation 和 critearia api 之间有什么区别。它们是完全一样还是有什么不同(它们的写作风格是不同,我的意思是它们之间的任何性能或其他问题) 大多数情况下,我更喜欢@Query 注释,它看起来很简单。或者有人可以建议任何其他选项,例如 @Query 或 spring jpa 中的标准 api。@Query 样式有什么缺点吗?

@Query("SELECT u FROM User u WHERE u.status = 1")
Collection<User> findAllActiveUsers();

List<Book> findBooksByAuthorNameAndTitle(String authorName, String title) {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Book> cq = cb.createQuery(Book.class);

【问题讨论】:

    标签: spring-boot spring-data-jpa spring-data


    【解决方案1】:

    使用@Query,我们可以传递静态查询或预编译查询,这样我们就可以对数据执行选择和非选择操作 其中Criteria 适用于执行动态查询,当在运行时知道数据时会出现此类要求 但是使用条件 api,我们只能对数据执行选择操作。

    例如

    @Query(value = "SELECT u FROM User u")
    List<User> findAllUsers(Sort sort);
    

    我们还可以使用@Query 处理预编译查询 例如

    @Query("SELECT u FROM User u WHERE u.status = :status and u.name = :name")
    User findUserByStatusAndNameNamedParams(
      @Param("status") Integer status, 
      @Param("name") String name);)
    

    动态查询,如

    Criteria cr = session.createCriteria(Employee.class);
    
    // To get records having salary more than 2000
    cr.add(Restrictions.gt("salary", 2000));
    
    // To get records having salary less than 2000
    cr.add(Restrictions.lt("salary", 2000));
    

    当我们遇到需要基于条件或数据集(其值仅在运行时才知道)构建 SQL 语句时,才会真正使用动态查询。而且,在这些情况下,我们不能只使用静态查询所以我们不能只使用@Query注解,因为我们不能提供静态 SQL 语句。在这种情况下,我们使用Criteria API

    有关更多信息,请点击提供的链接 @Query and Criteria

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 2021-10-16
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 2018-03-28
      • 2020-05-20
      相关资源
      最近更新 更多