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

37 篇文章 10 订阅

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

(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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值