JPA编写SQL语句


前言

在JPA中可以根据提供方法的命名规则,编写相应的方法来查询数据库,而不用自己编写SQL语句。但是在一些复杂的查询时,需要自己编写SQL语句,来完成相应的查询,那么下面就来谈谈如何自定义SQL语句。


一、@Query注解概述

@Query主要是用于自定义SQL语句。
在自定义的持久层接口(该接口继承JpaRepository接口)方法上打上@Query注解,就可以使用自己定义的SQL语句,此时方法名可以不用遵守Jpa的命名规则。

二、@Query注解的使用

2.1、SQL和HQL基本查询

@Query注解中一个参数nativeQuery,默认值为false,意为使用HQL语句,修改为true时,意为使用SQL语句。

HQL是Hibernate的查询方式,是面对对象的查询规则,在操作时是对实体对象进行操作。
SQL则是执行自己编写的原生SQL。

2.2.1、使用SQL查询数据

先创建一个与数据库对应的实体
示例代码为:

@Entity
@Setter
@Getter
public class User {
    private String username;
    private String password;
    @Id
    private int id;
}

随后创建一个接口,继承JpaRepository,在findOneById方法上打上@Query注解,value参数是自己编写的SQL语句。
注意两个点:
①?后面跟着的数字,表示方法中的第几个参数
②需要设置nativeQuery = true,才能使用自己编写的原生SQL语句
示例代码为:

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {

   @Query(value = "select u.id, u.username, u.password from user as u where u.id = ?1",nativeQuery = true)
   User findOneById(int id);
}

2.2.2、HQL的形式查询数据

没有设置nativeQuery = true,就是默认使用HQL的形式查询数据库。
这种方式是对实体进行操作,让JPA帮我们自动生成SQL代码查询数据库。

示例代码为:

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
   
   @Query(value = "select u.username,u.password,u.id from User as u where u.username = :username")
   List<Object> findOneByUsername(String username);

   @Query(value = "from User u where u.password = :password")
   User find(String password);
}

需要注意三个点:
①没有使用?数字,而是用 :参数名 的形式
②from User,这里跟的是实体类的名字,而不是表名
③如果查询一个个字段,如上面的 select u.username,u.password,u.id…,查询返回的结果需要Object[] 类型的,不会自动填充到User类中。而直接from User…,没有使用select来一个一个字段对应,返回的结果会自动填充到User中。

2.2.3、复杂查询

在执行复杂查询的时候,一般都是要自己编写SQL,这些查询就在上面的基础上添加一些查询限制即可(和SQL语句的编写一致)。

注:如果需要进行增、删、改,还需要在方法上打上@Modifying注解


总结

虽然JPA为我们提供了很多的查询方法的定义,但是在复杂查询的时候还是要自己编写SQL代码才能够完成查询操作,所以@Query的使用还是非常有必要的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值