SpringData JPA中查詢接口Repository的使用
什么是JPA
SpringData是Spring提供的一個(gè)數(shù)據(jù)操作框架,而SpringData JPA則是該框架下基于JPA標(biāo)準(zhǔn)進(jìn)行數(shù)據(jù)操作的模塊。
SpringData JPA簡化了持久層代碼的操作,只需編寫接口即可實(shí)現(xiàn)。
JPA,全稱Java Persistence API,是Spring Data的子項(xiàng)目之一。它是JDK 5.0的注解或XML描述對象與關(guān)系表映射關(guān)系的工具,可以將運(yùn)行時(shí)的實(shí)體對象持久化到數(shù)據(jù)庫中。
JPA和Mybatis都是持久層框架,具有相同的功能。然而,由于Mybatis的廣泛使用,現(xiàn)在了解和使用JPA的人較少。
JPQL 是從 Hibernate 的 HQL 演變而來的,其語法與 HQL 非常相似。HQL,即 Hibernate Query Language(Hibernate查詢語言),而 SQL 是 Structure Query Language(結(jié)構(gòu)化查詢語言)。
它們的主要區(qū)別在于:SQL 直接操作數(shù)據(jù)庫中的表和字段,而 HQL 則操作實(shí)體對象和屬性。
需要注意的是,我們編寫的 JPQL 最終仍會被轉(zhuǎn)換成 SQL 語句進(jìn)行執(zhí)行。
接口繼承關(guān)系
Repository<T, ID>接口 最頂層接口 作用自定義JPQL語句
/** * 使用@Query注解,自定義JPQL語句 * JPQL語句中,使用的不是表名,而是實(shí)體類名,不是列名,而是屬性名, * 例如SQL語句:select * from user JPQL語句是:select User from User * 如果是條件查詢,之前語句中的占位符?可以使用(:xxx)進(jìn)行表示 * 此時(shí)xxx會根據(jù)方法中同名的形參自動綁定值 */ public interface UsersRepositoryByQuery extends Repository<User, Integer> { //如果是查詢所有列,可以省略select ....,從from開始寫 @Query("from User where name=:name") List<User> selectByName(String name); //select * from user where name=? @Query("select u from User u where name=:name and age=:age") List<User> selectByNameAndAge(String name, Integer age); //select * from user where name=? and age=? @Query("from User where name=:name and age=:age") List<User> selectByNameLike(String name);//select * from user where name like ? //除了使用JPQL語句,也是可以使用sql原生語句,在注解中設(shè)置參數(shù)nativeQuery = true,不推薦! @Query(value = "select * from user where name=:name",nativeQuery = true) List<User> selectByNameSQl(String name);//select * from user where name=? }
CrudRepository接口 繼承了Repository接口,內(nèi)置類增刪改查的方法
PagingAndSortingRepository接口繼承了CrudRepository接口增加了分頁和排序方法
@Autowired private UserRepositoryPage userRepositoryPage; /** * 分頁 */ @Test void testPage(){ //第一個(gè)參數(shù)是頁碼數(shù),0表示第一頁;第二參數(shù)是分頁單位; Pageable Pageable = PageRequest.of(0, 2); Page<User> page = userRepositoryPage.findAll(Pageable); System.out.println("總數(shù)據(jù)量"+page.getTotalElements()); System.out.println("總頁數(shù)"+page.getTotalPages()); List<User> content = page.getContent(); for (User user : content) { System.out.println(user); } } /** * 排序 */ @Test void testSort(){ //根據(jù)id排序 Sort sort = Sort.by(Sort.Order.desc("id")); Iterable<User> all = userRepositoryPage.findAll(sort); for (User user : all) { System.out.println(user); } }
JpaRepository<T, ID> 接口
繼承了 PagingAndSortingRepository<T, ID>
和查詢接口 QueryByExampleExecutor
特點(diǎn)是可以幫助我們將其他接口的方法的返回值做適配處理??梢允沟梦覀冊陂_發(fā)時(shí)更方便的使用這些方法
JpaSpecificationExecutor 接口 主要提供了多條件查詢的支持,并且可以在查詢中添加分頁與排序
JpaSpecificationExecutor接口與以上接口沒有關(guān)系,完全獨(dú)立。不能單獨(dú)使用,需要配合著JPA 中的其他接口一起使用。
//接口 public interface UserRepositoryExJPA extends JpaRepository<User,Integer>,JpaSpecificationExecutor<User> { } //使用 @Autowired private UserRepositoryExJPA userRepositoryExJPA; /** * 自定義規(guī)則,可以多條件查詢 */ @Test void testExJPA2() { Specification<User> specification = new Specification<User>() { @Override public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) { //模糊查詢 Predicate predicate = criteriaBuilder.like(root.get("name"), "張%"); //模糊查詢+性別篩選+年齡篩選 Predicate predicate2 = criteriaBuilder.and(criteriaBuilder.like(root.get("name"), "張%"), criteriaBuilder.equal(root.get("sex"), "男"), criteriaBuilder.gt(root.get("age"), 24)); return predicate2; } }; //進(jìn)行排序年齡進(jìn)行倒序排列 Sort sort = Sort.by(Sort.Order.desc("age")); //分頁+追加排序 Pageable pageable = PageRequest.of(0, 2, sort); Page<User> page = userRepositoryExJPA.findAll(specification, pageable); System.out.println("根據(jù)條件查詢到" + page.getTotalElements() + "條數(shù)據(jù)"); System.out.println("根據(jù)條件查詢到" + page.getTotalPages() + "頁數(shù)據(jù)"); System.out.println("當(dāng)頁數(shù)據(jù)"); for (User user : page) { System.out.println(user); } }
JpaRepositoryImplementation<T, ID> 接口
繼承了 JpaRepository<T, ID>, JpaSpecificationExecutor 接口
實(shí)現(xiàn)類為SimpleJpaRepository<T, ID> 接口 功能最強(qiáng)大
關(guān)鍵命名查詢
根據(jù) Spring Data 的規(guī)范,查詢方法應(yīng)以 find、read 或 get 開頭(例如 find、findBy、read、readBy、get、getBy)。當(dāng)涉及到查詢條件時(shí),應(yīng)使用條件關(guān)鍵字連接屬性,并確保條件屬性的首字母大寫。在解析方法名時(shí),框架會先去除多余的前綴,然后對剩余部分進(jìn)行解析。
你可以直接在接口中定義查詢方法,只要符合規(guī)范,就無需編寫實(shí)現(xiàn)或 SQL。目前支持的關(guān)鍵字寫法如下:
到此這篇關(guān)于SpringData JPA中查詢接口Repository的使用的文章就介紹到這了,更多相關(guān)SpringData JPA Repository內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合dataworks的實(shí)現(xiàn)過程
這篇文章主要介紹了SpringBoot整合dataworks的實(shí)現(xiàn)過程,實(shí)現(xiàn)主要是編寫工具類,如果需要?jiǎng)t可以配置成SpringBean,注入容器即可使用,需要的朋友可以參考下2022-08-08springboot?@PostConstruct無效的解決
這篇文章主要介紹了springboot?@PostConstruct無效的解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11