Spring boot -JPA 之优雅 开发自己的CRUD

136 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Jpa就是ORM的规范,不是orm框架 hibernate就是 实现,也是jpa的子集

声明接口

public interface UserRepository extends JpaRepository<User, Long>{
  List<User> findByLastname(String lastname);

  User findByEmailAddress(String emailAddress);
}

名创建查询

public interface UserRepository extends Repository<User, Long> {

  List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);
}

方法名中支持的关键字

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

使用高级 LIKE 表达式

public interface UserRepository extends JpaRepository<User, Long> {
  @Query("select u from User u where u.firstname like %?1")
  List<User> findByFirstnameEndsWith(String firstname);
}

本地查询

nativeQuery = true

public interface UserRepository extends JpaRepository<User, Long> {
  @Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
  User findByEmailAddress(String emailAddress);
}

在查询方法中声明本机计数查询的分页@Query

public interface UserRepository extends JpaRepository<User, Long> {
  @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
    countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
    nativeQuery = true)
  Page<User> findByLastname(String lastname, Pageable pageable);
}

使用 Sort排序

public interface UserRepository extends JpaRepository<User, Long> {
  @Query("select u from User u where u.lastname like ?1%")
  List<User> findByAndSort(String lastname, Sort sort);
}

使用命名参数

public interface UserRepository extends JpaRepository<User, Long> {
  @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname")
  User findByLastnameOrFirstname(@Param("lastname") String lastname,
                                 @Param("firstname") String firstname);
}

修改查询

@Modifying
@Query("update User u set u.firstname = ?1 where u.lastname = ?2")
int setFixedFirstnameFor(String firstname, String lastname);

修改查询

@Modifying
@Query("update User u set u.firstname = ?1 where u.lastname = ?2")
int setFixedFirstnameFor(String firstname, String lastname);

@modifing 对查询方法进行注释来修改只需要参数绑定的查询。派生的查询方法或自定义方法不需要此注释

派生的删除查询

interface UserRepository extends Repository<User, Long> {
  void deleteByRoleId(long roleId);
  @Modifying
  @Query("delete from User u where u.role.id = ?1")
  void deleteInBulkByRoleId(long roleId);
}

虽然 deleteByRoleId (...)方法看起来基本上产生的结果与 deleteInBulkByRoleId (...)相同,但是这两个方法声明在运行方式上有一个重要的区别。顾名思义,后一种方法对数据库发出单个 JPQL 查询(在注释中定义的那个)。这意味着即使是当前加载的 User 实例也不会看到调用生命周期回调。

在次学习jpa,如果不去使用,学了很容易忘记。

jpa是约定大于配置

JpaRepository这个接口

实现这个JpaRepository 有两个参数 第一个: 实体名,第二个主键id 的类型(包装类)

删除与修改时 在service 加上事务注解@T

@Modifying 必须加上这个注解 @Query("delete from User (User实体类名称) u where u.role.id = ?1") @Query("update User u set u.firstname = ?1 (索引位置) where u.lastname = ?2") 也有必要在service 加上事务注解@T

传参方式: 参数名与参数索引语法

参数名:

  @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname")     
  //    sql中是冒号参数名   :firstname     ,sql 中  User  是实体名称  ,他会映射表名  应为在实体类山加过注解
  		//Java参数中 加注解@Param("lastname")
  User findByLastnameOrFirstname(@Param("lastname") String lastname,
                                 @Param("firstname") String firstname);

参数索引传参:

  @Query("delete from User u where u.role.id = ?1")
  // 问好  第几个参数     ,实例中第一个参数
  void deleteInBulkByRoleId(long roleId);