0
点赞
收藏
分享

微信扫一扫

十四、Spring Data JPA 常用接口

分湖芝蘭 2022-01-31 阅读 23
springjava

十四、Spring Data JPA 常用接口

(一)、Repository 接口

1.方法

方法名称查询

  • 创建自定义接口,继承类Repository;
  • 创建方法实现数据查询;
  • 方法名称命名规则: findBy + 属性名(首字母大写) + 查询条件(首字母大写 Is Equals)

代码:

查询接口:
public interface UserRepositoryByName extends Repository<User,Integer> {

    /**
     * 通过name查询
     * @param name
     * @return
     */
    List<User> findByName(String name);

    /**
     * 通过name和age查询
     * @param name
     * @param age
     * @return
     */
    List<User> findByNameAndAge(String name, Integer age);

    /**
     * 通过name或age查询
     * @param name
     * @param age
     * @return
     */
    List<User> findByNameOrAge(String name, Integer age);

    /**
     * 通过名称模糊查询
     * @param name
     * @return
     */
    List<User> findByNameLike(String name);
}
测试:
    
@SpringBootTest
class ApplicationTests {

    @Autowired
    private UserRepositoryByName userRepositoryByName;

    @Test
    void testSelectByName() {
        List<User> users = userRepositoryByName.findByName("苏九儿");
        // name查询
        System.out.println("name查询:");
        for (User user : users) {
            System.out.println(user.toString());
        }

        List<User> byNameAndAge = userRepositoryByName.findByNameAndAge("苏九儿", 23);
        // name和age查询
        System.out.println("name和age查询:");
        for (User user : byNameAndAge) {
            System.out.println(user.toString());
        }

        List<User> byNameOrAge = userRepositoryByName.findByNameOrAge("苏九儿", 16);
        System.out.println("name或age查询:");
        for (User user : byNameOrAge) {
            System.out.println(user.toString());
        }

        List<User> byNameLike = userRepositoryByName.findByNameLike("%九%");
        System.out.println("name模糊查询:");
        for (User user : byNameLike) {
            System.out.println(user.toString());
        }
    }
}

2.注解

@Query

  • 创建自定义接口,继承类Repository;
  • 创建方法实现数据查询;

注: update,更新数据需要在调用时添加事务
代码:

查询接口创建:
public interface UserRepositoryAnnotation extends Repository<User, Integer> {

    /**
     * JPQL
     * 根据name查询
     * ?1
     * ?-->占位符
     * 1 -->索引
     * @param name
     * @return
     */
    @Query(value = "from User where name = ?1")
    List<User> findJpql(String name);

    /**
     * JPQL
     * 更新操作 添加注解 @Modifying
     * @param age
     * @param id
     */
    @Query(value = "update User set age = ?1 where id = ?2")
    @Modifying
    void updateAge(Integer age,Integer id);

    /**
     * SQL 查询
     * nativeQuery 本地查询
     * false  jpql查询 默认
     * true   SQL查询
     * @param name
     * @return
     */
    @Query(value= "select * from t_user where name=?1", nativeQuery = true)
    List<User> findByName(String name);

    /**
     * 模糊查询
     * @param name
     * @return
     */
    @Query(value="select * from t_user where name like ?", nativeQuery = true)
    List<User> findByNameL(String name);
}

测试:
@SpringBootTest
class ApplicationTests {

    @Autowired
    private UserRepositoryAnnotation userRepositoryAnnotation;

    @Test
    @Transactional
    void testSelectByAnnotation(){
        List<User> byName = userRepositoryAnnotation.findJpql("苏九儿");
        System.out.println("name查询:");
        for (User user : byName) {
            System.out.println(user.toString());
        }

        System.out.println("更新age:");
        userRepositoryAnnotation.updateAge(10, 1);

        List<User> byNameHSQL = userRepositoryAnnotation.findByName("三三");
        System.out.println("HSQL name查询:");
        for (User user : byNameHSQL) {
            System.out.println(user.toString());
        }

        List<User> byNameLikeHSQL = userRepositoryAnnotation.findByNameL("%三%");
        System.out.println("HSQL name Like查询:");
        for (User user : byNameLikeHSQL) {
            System.out.println(user.toString());
        }
    }
}

(二)、CurdRepository

  • 继承接口Repository包含其所有方法特性;
  • 主要提供对数据库的增、删、改、查;
    CurdRepository

(三)、PagingAndSortingRepository

  • 继承接口CurdRepository,包含其所有方法特性;
  • 主要提供分页查询及排序查询;
    PagingAndSortingRepository述
    代码:
public interface UserPageSortRepository extends PagingAndSortingRepository<User,Integer> {
}

测试:
    
@SpringBootTest
class ApplicationTests {

    @Autowired
    private UserPageSortRepository userPageSortRepository;

    @Test
    void testPagingAndSort(){

        // sort
        Sort sort = Sort.by(Sort.Direction.ASC, "name");
        List<User> users = (List<User>) userPageSortRepository.findAll(sort);
        System.out.println("sort 查询:");
        for (User user : users) {
            System.out.println(user.toString());
        }

        // page
        Pageable pageable = PageRequest.of(0,2);
        Page<User> byPage = userPageSortRepository.findAll(pageable);
        System.out.println("page 查询:");
        System.out.println("大小:" + byPage.getTotalElements());
        System.out.println("当前页:" + byPage.getNumber());
        System.out.println("每页大小:" + byPage.getSize());
        for (User user : byPage.getContent()) {
            System.out.println(user.toString());
        }
    }
}

(四)、JpaRepository

  • 继承接口PagingAndSortingRepository包含其所有方法及特性;
  • 主要对接口PagingAndSortingRepository的查询结果进行了转换。
    JpaRepository

(五)、JpaSpecificationExecutor

  • 主要提供对数据库的一些复杂查询,如条件分页、条件排序等;
  • 通过配合接口JpaRepository使用,单独继承接口JpaSpecificationExecutor会出现异常。
    JpaSpecificationExecutor
举报

相关推荐

0 条评论