[Springdata Jpa 框架应用 ]

目录

🧆前言:

🧆Spring Data JPA 提供了许多函数,包括以下几种:

🧆基于约定函数命名的查询

🧆可以根据方法名自动生成相应的SQL语句,例如:

🧆使用@Query注解可以自定义查询语句,如:

🧆需要注意的是,如果使用的是SQL语法,需要设置nativeQuery属性为true,如:

🧆Criteria 查询构建器:Sping Data JPA 提供的 Criteria API 可以动态构建允许复杂查询的 OR 和 AND 条件、各种各样的比较策略,实现海量数据查询。

🧆Spring Data JPA中的分页函数主要有以下几种:

🧆分页查询 findAll(Pageable pageable)

🧆带条件的分页查询 findAll(Specification spec, Pageable pageable)

🧆使用@Query注解的分页查询

🧆 Spring Data JPA 提供了常用的更新操作函数

🧆使用继承自 JpaRepository 的 save()、saveAll() 函数进行更新。

🧆使用继承自 JpaRepository 接口中的 flush() 函数刷新更新到实体,写入数据到数据库。

🧆使用继承自 CrudRepository 的 saveAll() 函数进行批量更新操作的支持。

🧆通过 Spring Data 中的 @Modifying 注解使用 UPDATE 操作,用它进行 SQL 手写的功能支持。

🧆Spring Data JPA中的自定义函数可以在Repository中定义,通过@Query注解或方法命名规则来实现。以下是常见的自定义函数:

🧆命名查询

🧆使用@Query注解

🧆使用@Query注解自定义更新操作

🧆使用JPA Criteria API

🧆总结:


🧆前言:

🧆🧆🧆🧆🧆       记录一下这些函数信息,希望你可以用上

🧆🧆🧆🧆🧆       给大家吃点肉丸子 好吃的

🧆🧆🧆🧆🧆

🧆🧆🧆🧆🧆

🧆Spring Data JPA 提供了许多函数,包括以下几种:

  1. 查询函数:如findBy、getBy、readBy、queryBy等,用于根据属性值查询实体对象。

  2. 排序函数:如orderBy、sort等,用于对查询结果进行排序。

  3. 分页函数:如findAll(Pageable pageable)、findAll(Pageable pageable, Specification spec)等,用于对查询结果进行分页。

  4. 聚合函数:如count、sum、avg、max、min等,用于对查询结果进行聚合计算。

  5. 更新函数:如save、delete、update等,用于对实体对象进行增删改操作。

  6. 自定义函数:可以根据需要自定义函数,如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);
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是汤圆丫

怎么 给1分?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值