本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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);