日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring data jpa 条件分页查询

發(fā)布時(shí)間:2023/12/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring data jpa 条件分页查询 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

PS:一半轉(zhuǎn)載,一半自己的用例

作者:javaniu

鏈接:https://www.zhihu.com/question/37873032/answer/73991650
來源:知乎
著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)。( PS:暫時(shí)沒有知乎賬號,所以沒有聯(lián)系原作者,請?jiān)髡咭娬?#xff01;

springdata jpa總結(jié)的查詢方法有如下:

  • findOneByName按用戶名查詢User對象
  • findAllByLargeThanId查詢id號大于指定參數(shù)值的User對象列表,分頁P(yáng)age返回
  • findAllByIdAndName查詢id和用戶名等于指定參數(shù)值的User對象,可以通過多個(gè)Predicate來查詢
  • findAllByLikeName模糊分頁查詢用戶名,like查詢
  • findAllByInIds查詢指定的id集合用戶對象列表
  • findAllByIds通過原生sql查詢指定的用戶id對象列表
  • findAllByName通過JPA query查詢用戶名等于指定值的用戶對象
  • 多個(gè)排序語法: Sort sort = new Sort(Direction.DESC, "sort").and(new Sort(Direction.DESC, "id"));
  • package com.zuidaima.springdata.service.impl;import java.util.ArrayList; import java.util.List;import javax.annotation.Resource; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Path; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root;import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service;import com.zuidaima.springdata.entity.User; import com.zuidaima.springdata.repository.UserRepository; import com.zuidaima.springdata.service.UserService;/** * *@author javaniu 2013-06-04 22:27:23 */@Service public class UserServiceImpl implements UserService {@Resourcepublic UserRepository userRepository;@Overridepublic User findOneByName(final String name) {Specification<User> specification = new Specification<User>() {@Overridepublic Predicate toPredicate(Root<User> root,CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {Predicate _name = criteriaBuilder.equal(root.get("name"), name);return criteriaBuilder.and(_name);}};return userRepository.findOne(specification);}@Overridepublic Page<User> findAllByLargeThanId(final Long id, int page, int count,Sort sort) {Specification<User> specification = new Specification<User>() {@Overridepublic Predicate toPredicate(Root<User> root,CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {Path<Long> $id = root.get("id");Predicate _id = criteriaBuilder.gt($id, id);return criteriaBuilder.and(_id);}};Pageable pageable = new PageRequest(page - 1, count, sort);return userRepository.findAll(specification, pageable);}@Overridepublic User findAllByIdAndName(final Long id, final String name) {Specification<User> specification = new Specification<User>() {@Overridepublic Predicate toPredicate(Root<User> root,CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {List<Predicate> predicates = new ArrayList<Predicate>();Path<Long> $id = root.get("id");Predicate _id = criteriaBuilder.equal($id, id);predicates.add(_id);Path<Long> $name = root.get("name");Predicate _name = criteriaBuilder.equal($name, name);predicates.add(_name);return criteriaBuilder.and(predicates.toArray(new Predicate[] {}));}};return userRepository.findOne(specification);}@Overridepublic Page<User> findAllByLikeName(final String name, int page, int count) {Specification<User> specification = new Specification<User>() {@Overridepublic Predicate toPredicate(Root<User> root,CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {Path<String> _name = root.get("name");Predicate _key = criteriaBuilder.like(_name, "%" + name + "%");return criteriaBuilder.and(_key);}};Sort sort = new Sort(Direction.DESC, "id");Pageable pageable = new PageRequest(page - 1, count, sort);return userRepository.findAll(specification, pageable);}@Overridepublic Page<User> findAllByInIds(final List<Long> ids) {Specification<User> specification = new Specification<User>() {@Overridepublic Predicate toPredicate(Root<User> root,CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {return criteriaBuilder.in(root.get("id")).value(ids);}};int page = 1;int count = ids.size();Sort sort = new Sort(Direction.DESC, "id");Pageable pageable = new PageRequest(page - 1, count, sort);return userRepository.findAll(specification, pageable);}@Overridepublic List<User> findAllByIds(List<Long> ids) {return userRepository.findAllByIds(ids);}@Overridepublic User findAllByName(String name) {return userRepository.findAllByName(name);}} ===================================== 華麗分割線 =============================================== 以下是我在項(xiàng)目中的實(shí)際運(yùn)用: 1.實(shí)體類:GsTest(這里就不貼代碼了) 2.Dao層: @Repositorypublic interface GsTestDao extends JpaRepository<GsTest, Long>,JpaSpecificationExecutor<GsTest>{ ?} 3.Service層 :(也可以是單獨(dú)的某個(gè)參數(shù),詳情見上面),page:頁數(shù),conut:每頁的條數(shù),sort:排序 Page<GsTest> findOneByName(GsTest gsTest,int page,int count,Sort sort); 4.ServiceImpl層 //分頁 ?條件為年齡和 姓名。 @Override public Page<GsTest> findOneByName(final GsTest gsTest,int page,int count,Sort sort) { Specification<GsTest> specification = new Specification<GsTest>() { @Override public Predicate toPredicate(Root<GsTest> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) { List<Predicate> predicates = new ArrayList<Predicate>(); //參數(shù)非空判斷。不為空則加此條件 if (!gsTest.getAge().isEmpty()) { Predicate _age = criteriaBuilder.equal(root.get("age"), gsTest.getAge()); predicates.add(_age); System.out.println("_age:"+gsTest.getAge().isEmpty()); } Predicate _name = criteriaBuilder.equal(root.get("name"), gsTest.getName()); predicates.add(_name); //return criteriaBuilder.and(_name); return criteriaBuilder.and(predicates.toArray(new Predicate[]{})); } }; 4.controller:控制層 /** *? * @param gsTestDto 實(shí)體,用來接收傳來JSON類型參數(shù) * @param pageNumber ?頁數(shù) * @param pageSize ? 條數(shù) * @return */ @RequestMapping(value="/fin",method = RequestMethod.POST) @ResponseBody public ?Page<GsTest> findTest(@RequestBody GsTestDto gsTestDto,@RequestParam(value = "page", defaultValue = "1") int pageNumber, @RequestParam(value = "size", defaultValue = Constants.PAGE_SIZE_10) int pageSize){ GsTest gsTest = new GsTest(); gsTest=converterIn.convertIn(gsTestDto); System.out.println("GsTestDto:"+gsTest); //排序 Sort sort = new Sort(Direction.ASC, "id"); Page<GsTest> findOneByName = gsTestDaoService.findOneByName(gsTest,pageNumber,pageSize,sort); return findOneByName; } 到此,條件分頁就完成了。看看測試結(jié)果: 我用的是 谷歌的Postman來進(jìn)行測試: 1.傳參: { "name": "jak" } 結(jié)果: {"content": [{"id": 3,"properties_string": null,"name": "jak","age": "21","sex": "女","status": "1","certime": "2013-05-11 09:00:00"},{"id": 4,"properties_string": null,"name": "jak","age": "21","sex": "女","status": "1","certime": "2013-05-11 09:00:00"},{"id": 5,"properties_string": null,"name": "jak","age": "21","sex": "女","status": "1","certime": "2013-05-11 09:00:00"}],"size": 10,"number": 0,"sort": [{"direction": "ASC","property": "id","ascending": true}],"lastPage": true,"firstPage": true,"totalPages": 1,"totalElements": 3,"numberOfElements": 3 } 2.傳錯(cuò)誤的參數(shù): {"name": "jak","age":"22" } 結(jié)果: {"content": [],"size": 10,"number": 0,"sort": [{"direction": "ASC","property": "id","ascending": true}],"lastPage": true,"firstPage": true,"totalPages": 0,"totalElements": 0,"numberOfElements": 0 } 可以看得到 查不到的時(shí)候。content 是空值! 到此,簡單的條件分頁查詢就完成了,我也是小白,不妥之處見諒!===============2017年3月2日10:28:46======= 華麗分割線 =============================================== 注:接著上面的 實(shí)體類:prid實(shí)體類中有一個(gè)時(shí)間屬性:private Date beginTime; private Date endTime;
    JPA 查詢運(yùn)用的時(shí)候應(yīng)該是:
    SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
    Predicate dueTime = criteriaBuilder.between(root.<Date>get("dueTime"),sdf2.parse(prid.getBeginTime()),sdf2.parse(prid.getEndTime()));

    注:parse()返回的是一個(gè)Date類型數(shù)據(jù)

    總結(jié)

    以上是生活随笔為你收集整理的spring data jpa 条件分页查询的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。