生活随笔
收集整理的這篇文章主要介紹了
spring data jpa 条件分页查询
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
PS:一半轉(zhuǎn)載,一半自己的用例
作者:javaniu
鏈接:https://www.zhihu.com/question/37873032/answer/73991650
來源:知乎
著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)。(
PS:暫時(shí)沒有知乎賬號(hào),所以沒有聯(lián)系原作者,請(qǐng)?jiān)髡咭娬?#xff01;)
springdata jpa總結(jié)的查詢方法有如下:
findOneByName按用戶名查詢User對(duì)象findAllByLargeThanId查詢id號(hào)大于指定參數(shù)值的User對(duì)象列表,分頁P(yáng)age返回findAllByIdAndName查詢id和用戶名等于指定參數(shù)值的User對(duì)象,可以通過多個(gè)Predicate來查詢findAllByLikeName模糊分頁查詢用戶名,like查詢findAllByInIds查詢指定的id集合用戶對(duì)象列表findAllByIds通過原生sql查詢指定的用戶id對(duì)象列表findAllByName通過JPA query查詢用戶名等于指定值的用戶對(duì)象多個(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;
} 到此,條件分頁就完成了。看看測(cè)試結(jié)果: 我用的是 谷歌的Postman來進(jìn)行測(cè)試: 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 是空值!
到此,簡(jiǎn)單的條件分頁查詢就完成了,我也是小白,不妥之處見諒!
===============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 条件分页查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。