目录
🧆Spring Data JPA 提供了许多函数,包括以下几种:
🧆需要注意的是,如果使用的是SQL语法,需要设置nativeQuery属性为true,如:
🧆Criteria 查询构建器:Sping Data JPA 提供的 Criteria API 可以动态构建允许复杂查询的 OR 和 AND 条件、各种各样的比较策略,实现海量数据查询。
🧆Spring Data JPA中的分页函数主要有以下几种:
🧆分页查询 findAll(Pageable pageable)
🧆带条件的分页查询 findAll(Specification spec, Pageable pageable)
🧆 Spring Data JPA 提供了常用的更新操作函数
🧆使用继承自 JpaRepository 的 save()、saveAll() 函数进行更新。
🧆使用继承自 JpaRepository 接口中的 flush() 函数刷新更新到实体,写入数据到数据库。
🧆使用继承自 CrudRepository 的 saveAll() 函数进行批量更新操作的支持。
🧆通过 Spring Data 中的 @Modifying 注解使用 UPDATE 操作,用它进行 SQL 手写的功能支持。
🧆Spring Data JPA中的自定义函数可以在Repository中定义,通过@Query注解或方法命名规则来实现。以下是常见的自定义函数:
🧆前言:
🧆🧆🧆🧆🧆 记录一下这些函数信息,希望你可以用上
🧆🧆🧆🧆🧆 给大家吃点肉丸子 好吃的
🧆🧆🧆🧆🧆
🧆🧆🧆🧆🧆
🧆Spring Data JPA 提供了许多函数,包括以下几种:
-
查询函数:如findBy、getBy、readBy、queryBy等,用于根据属性值查询实体对象。
-
排序函数:如orderBy、sort等,用于对查询结果进行排序。
-
分页函数:如findAll(Pageable pageable)、findAll(Pageable pageable, Specification spec)等,用于对查询结果进行分页。
-
聚合函数:如count、sum、avg、max、min等,用于对查询结果进行聚合计算。
-
更新函数:如save、delete、update等,用于对实体对象进行增删改操作。
-
自定义函数:可以根据需要自定义函数,如findByNameAndAge、findByAddress等。
🧆基于约定函数命名的查询
在使用基于约定函数命名的查询时,Spring Data JPA会根据函数名自动生成相应的SQL语句。方法名以 "findBy"、"findAllBy"、"readBy"、"getBy"、"queryBy"、"searchBy"、"streamBy"、"countBy" 开头,后面跟属性名,可以通过多个属性名组合来进行查询。例如:
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
List<User> findAllByAgeGreaterThanEqualAndGender(int age, Gender gender);
long countByRole(Role role);
}
🧆可以根据方法名自动生成相应的SQL语句,例如:
SELECT * FROM user WHERE username = ?1
SELECT * FROM user WHERE age >= ?1 AND gender = ?2
SELECT COUNT(*) FROM user WHERE role = ?1
🧆使用@Query注解可以自定义查询语句,如:
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.username = :username")
User findByUsername(@Param("username") String username);
@Query("SELECT u FROM User u WHERE u.age >= :age AND u.gender = :gender")
List<User> findAllByAgeGreaterThanEqualAndGender(@Param("age") int age, @Param("gender") Gender gender);
}
在注解中可以使用JPQL语法("SELECT u FROM User u WHERE u.username = :username")或者SQL语法("SELECT * FROM user WHERE username = :username")进行自定义查询。同时,注解中使用@Param可以指定参数名称。
🧆需要注意的是,如果使用的是SQL语法,需要设置nativeQuery属性为true,如:
@Query(value = "SELECT * FROM user WHERE username = :username", nativeQuery = true)
User findByUsername(@Param("username") String username);
🧆Criteria 查询构建器:Sping Data JPA 提供的 Criteria API 可以动态构建允许复杂查询的 OR 和 AND 条件、各种各样的比较策略,实现海量数据查询。
public List<User> findByCriteria(String username, Integer age) {
Session session = entityManager.unwrap(Session.class);
CriteriaBuilder builder = session.getCriteriaBuilder();
// 创建 Criteria 查询
CriteriaQuery<User> criteria = builder.createQuery(User.class);
// 添加查询条件
Root<User> userRoot = criteria.from(User.class);
criteria.select(userRoot)
.where(builder.and(builder.equal(userRoot.get("username"), username)),
builder.and(builder.greaterThanOrEqualTo(userRoot.get("age"), age)));
// 执行查询条件
Query<UserDao> query = session.createQuery(criteria);
return query.getResultList();
}
- 通过使用 CriteriaBuilder 构建显式的 SQL查询类的代码,它可以展示 SQL 分句之间的逻辑组成。必要填写 WHERE 子句的每一段语义,它确定了查询的集合构图。获知 order :ASC 还是 DESC,JPA User URL 单体系统甚至 HADOOP 中的取数条款此时轻易确定。
🧆Spring Data JPA中的分页函数主要有以下几种:
🧆分页查询 findAll(Pageable pageable)
Pageable参数可以通过PageRequest.of(page, size)来创建,该函数会返回一个Page对象,其中包含了查询结果和分页信息,例如:
public interface UserRepository extends JpaRepository<User, Long> {
Page<User> findAll(Pageable pageable);
}
Page<User> page = userRepository.findAll(PageRequest.of(0, 10));
List<User> userList = page.getContent(); //查询结果
int totalPages = page.getTotalPages(); //总页数
🧆带条件的分页查询 findAll(Specification spec, Pageable pageable)
Specification参数用于动态生成查询条件,Pageable参数同上,例如:
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
Page<User> findAll(Specification<User> spec, Pageable pageable);
}
Specification<User> spec = (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
if (StringUtils.isNotBlank(username)) {
predicates.add(criteriaBuilder.equal(root.get("username"), username));
}
if (age != null) {
predicates.add(criteriaBuilder.greaterThan(root.get("age"), age));
}
return query.where(predicates.toArray(new Predicate[0])).getRestriction();
};
Page<User> page = userRepository.findAll(spec, PageRequest.of(0, 10));
🧆使用@Query注解的分页查询
可以在@Query注解中使用LIMIT关键字实现分页查询,例如:
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.username = :username ORDER BY u.createTime DESC")
List<User> findByUsername(@Param("username") String username, Pageable pageable);
}
List<User> userList = userRepository.findByUsername(username, PageRequest.of(0, 10));
🧆 Spring Data JPA 提供了常用的更新操作函数
🧆使用继承自 JpaRepository 的 save()、saveAll() 函数进行更新。
User user = userRepository.findById(userId).orElse(null);
user.setUserName(newName);
userRepository.save(user);
🧆使用继承自 JpaRepository 接口中的 flush() 函数刷新更新到实体,写入数据到数据库。
User user = userRepository.getOne(userId);
user.setUserName(newName);
userRepository.flush();
🧆使用继承自 CrudRepository 的 saveAll() 函数进行批量更新操作的支持。
List<User> userList = userRepository.findByAge(age);
for (User user : userList) {
user.setAge(newAge);
}
userRepository.saveAll(userList);
🧆通过 Spring Data 中的 @Modifying 注解使用 UPDATE 操作,用它进行 SQL 手写的功能支持。
@Modifying
@Query("update User u set u.username = ?1 where u.age = ?2")
int updateNameByAge(String username, Integer mAge);
🧆Spring Data JPA中的自定义函数可以在Repository中定义,通过@Query注解或方法命名规则来实现。以下是常见的自定义函数:
🧆命名查询
命名查询可以根据方法名称自动生成SQL查询语句。命名查询方法的名称应该以findBy/findAllBy/countBy开头,后面跟实体类中的属性名称。例如:
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByUsername(String username);
List<User> findAllByAgeGreaterThanEqualAndGender(int age, Gender gender);
long countByRole(Role role);
}
🧆使用@Query注解
@Query注解可以定义JPQL或SQL查询语句,例如:
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.username = :username")
List<User> findByUsername(@Param("username") String username);
@Query(value = "SELECT * FROM user WHERE age >= :age AND gender = :gender", nativeQuery = true)
List<User> findAllByAgeGreaterThanEqualAndGender(@Param("age") int age, @Param("gender") Gender gender);
}
🧆使用@Query注解自定义更新操作
@Query注解可以用于自定义更新操作,如:
需要注意的是,@Modifying注解必须与事务一起使用,否则会抛出异常
public interface UserRepository extends JpaRepository<User, Long> {
@Modifying
@Query("UPDATE User u SET u.status = :status WHERE u.id = :id")
int updateStatusById(@Param("id") Long id, @Param("status") int status);
}
userRepository.updateStatusById(1L, 1);
🧆使用JPA Criteria API
JPA Criteria API是一种类型安全的查询方案,可以根据实体类的属性来动态生成查询条件。例如:
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByCriteria(String username, Integer age, Gender gender) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<User> query = criteriaBuilder.createQuery(User.class);
Root<User> root = query.from(User.class);
List<Predicate> predicates = new ArrayList<>();
if (StringUtils.isNotBlank(username)) {
predicates.add(criteriaBuilder.equal(root.get("username"), username));
}
if (age != null) {
predicates.add(criteriaBuilder.greaterThan(root.get("age"), age));
}
if (gender != null) {
predicates.add(criteriaBuilder.equal(root.get("gender"), gender));
}
query.where(predicates.toArray(new Predicate[0]));
TypedQuery<User> typedQuery = entityManager.createQuery(query);
return typedQuery.getResultList();
}
}
List<User> userList = userRepository.findByCriteria("test", 20, Gender.MALE);
🧆总结:
其他函数调用都是基本格式不变,就算换函数就行 例如下面sum函数使用方式:
public interface OrderRepository extends JpaRepository<Order, Long> {
@Query("SELECT SUM(o.amount) FROM Order o WHERE o.status = :status")
BigDecimal sumAmountByStatus(@Param("status") int status);
}BigDecimal sumAmount = orderRepository.sumAmountByStatus(1);