Spring Data JPA 从入门到精通~@NamedQueries预定义查询

 这种是预定义查询的一种形式

(1)在 @Entity 下增加 @NamedQuery 定义。

public @interface NamedQuery {
   //query的名称,规则:实体.方法名;
   String name();
   //具体的JPQL查询语法
   String query();
}

需要注意,这里的 Query 里面的值也是 JPQL,查询参数也要和实体进行对应起来。因为实际场景 中这种破坏 Entity 的侵入式很不美感,也不方便,所以这种方式容易遗忘,工作中不推荐。

(2)与之相对应的还有 @NamedNativeQuery。用法一样,唯一不一样的是,Query 里面放置的是原生 SQL 语句,而非实体的字段名字。

用法举例

(1)实体里面的写法。

@Entity
@NamedQuery(name="Customer.findByFirstName",query = "select c from Customer c where c.firstName = ?1")
public class Customer {
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   private Long id;
   private String firstName;
   private String lastName;
......
}

(2)CustomerRepository 里面的写法。

Customer findByFirstName(String bauer);

(3)调用者的写法。

Customer customer = repository.findByFirstName("Bauer");

@NamedQuery 和 @Query 方法定义查询三者对比:

  • Spring JPA 里面的有先级,咱们前面章节有讲到过:@Query > @NameQuery > 方法定义查询。
  • 推荐使用的有优先级:@Query > 方法定义查询 > @NameQuery。
  • 相同点,都不支持动态条件查询。

@Query 的优缺点与实战经验分享

分类

描述

优点

(1)可以灵活快速使用JPQL和SQL

(2)对返回的结果和字段进行自定义

(3)支持连接表查询和对象关联查询,可以组合出复杂的SQL或JPQL

(4)可以很好的表达查询思路

(5)灵活性非常强,快捷方便

缺点

(1)不支持动态查询条件,参数个数如果不固定则不支持

(2)有些读者会将返回结果用Map或者Object[]数组接收结果,会导致调用此方法的开发人员不知道返回结果里面到底有些什么数据

实战经验

(1)当出现很复杂的SQL或者JPQL时候,建议用视图

(2)返回结果一定要用对象接收,最好每个对象里面的字段和返回的结果一一对应

(3)动态的QueryParam会在后面的章节中讲到

(4)能用JPQL,就不用SQL

上一篇:openGauss考试


下一篇:EventBus