1. 程式人生 > >spring data jpa 條件分頁查詢

spring data jpa 條件分頁查詢

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
{ @Resource public UserRepository userRepository; @Override public User findOneByName(final String name) { Specification<User> specification = new Specification<User>() { @Override public 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); } @Override public Page<User> findAllByLargeThanId(final Long id, int page, int count, Sort sort) { Specification<User> specification = new Specification<User>() { @Override public 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); } @Override public User findAllByIdAndName(final Long id, final String name) { Specification<User> specification = new Specification<User>() { @Override public 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); } @Override public Page<User> findAllByLikeName(final String name, int page, int count) { Specification<User> specification = new Specification<User>() { @Override public 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); } @Override public Page<User> findAllByInIds(final List<Long> ids) { Specification<User> specification = new Specification<User>() { @Override public 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); } @Override public List<User> findAllByIds(List<Long> ids) { return userRepository.findAllByIds(ids); } @Override public User findAllByName(String name) { return userRepository.findAllByName(name); } }
=====================================  華麗分割線  ===============================================
以下是我在專案中的實際運用:
1.實體類:GsTest(這裡就不貼程式碼了)
2.Dao層:
	@Repository
	public interface GsTestDao extends JpaRepository<GsTest, Long>,JpaSpecificationExecutor<GsTest>{
 
	}
3.Service層 :(也可以是單獨的某個引數,詳情見上面),page:頁數,conut:每頁的條數,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>();
//引數非空判斷。不為空則加此條件
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 實體,用來接收傳來JSON型別引數
 * @param pageNumber  頁數
 * @param pageSize   條數
 * @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;
}
到此,條件分頁就完成了。看看測試結果:
我用的是 谷歌的Postman來進行測試:
1.傳參:
  {
    "name": "jak"
}
結果:
{
  "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.傳錯誤的引數:
{
    "name": "jak",
    "age":"22"
}
結果:
{
  "content": [],
  "size": 10,
  "number": 0,
  "sort": [
    {
      "direction": "ASC",
      "property": "id",
      "ascending": true
    }
  ],
  "lastPage": true,
  "firstPage": true,
  "totalPages": 0,
  "totalElements": 0,
  "numberOfElements": 0
}
可以看得到 查不到的時候。content 是空值!
到此,簡單的條件分頁查詢就完成了,我也是小白,不妥之處見諒!

===============2017年3月2日10:28:46=======  華麗分割線  ===============================================
注:接著上面的
實體類:prid
         實體類中有一個時間屬性:
              private Date beginTime;               
               private Date endTime;

JPA 查詢運用的時候應該是:
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
Predicate dueTime = criteriaBuilder.between(root.<Date>get("dueTime"),sdf2.parse(prid.getBeginTime()),sdf2.parse(prid.getEndTime()));

注:parse()返回的是一個Date型別資料

相關推薦

spring data jpa 條件查詢

package com.zuidaima.springdata.service.impl; import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; import javax.persiste

Spring Boot中使用Spring-data-jpa實現查詢(轉)

分頁查詢 log def inpu database ext identity odin btn 在我們平時的工作中,查詢列表在我們的系統中基本隨處可見,那麽我們如何使用jpa進行多條件查詢以及查詢列表分頁呢?下面我將介紹兩種多條件查詢方式。 1、引入起步依賴

Spring Data JPA查詢

JPA的分頁查詢確實使用起來確實很簡單,但理解起來有點困難,此處只是實現JPA分頁的程式碼塊。 定義實體類: @Entity @Table(name = "t_pub_info") @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_REA

SpringBoot學習筆記10——spring-data-jpa查詢

今天我們來學習一下spring-data-jpa的分頁查詢的實現 在上次初探JPA之後我們接下來學習分頁查詢,本篇部落格是接上一篇的,如果有需要了解jpa配置的話可以看上一篇部落格https://blog.csdn.net/lp840312696/article/details/83549937

Spring Boot中使用Spring-data-jpa實現查詢

在我們平時的工作中,查詢列表在我們的系統中基本隨處可見,那麼我們如何使用jpa進行多條件查詢以及查詢列表分頁呢?下面我將介紹兩種多條件查詢方式。 1、引入起步依賴   <dependency> <groupId>org.springframe

Spring data JPA功能及複雜語句查詢

測試的資料表 // 實體類 @Entity @Data @AllArgsConstructor @NoArgsConstructor @Table(name="demo_user") public class DemoUser { @Id @Gener

Mongodb系列- 使用spring-data-mongodb實現查詢

mon 分頁查詢 rep template list pre pri 自動生成 aging 在用spring-data-mongodb框架開發的過程中,需要實現分頁查詢,就百度了下,沒找到滿意的又google了下,找到了思路. 在spring-data-mongodb 官

Spring Data之Slice查詢

背景 專案中我們經常用到分頁查詢,一般使用的場景有兩個 前端查詢大批量資料時指定page、size分頁查詢 後臺定時處理一批資料時,從資料庫獲取待處理資料,從而避免一次查詢太多資料到記憶體,處理完一批後再查詢下一頁的資料處理 對於場景2也有兩種實現方式

SpringBoot整合Spring Data JPA(包含、排序操作)完成資料獲取

Spring Data JPA是Spring基於Hibernate開發的一個JPA框架。如果用過Hibernate或者MyBatis的話,就會知道物件關係對映(ORM)框架有多麼方便。但是Spring Data JPA框架功能更進一步,為我們做了 一個數據持久層框架幾乎能做的任何事情。

spring data JpaSpecificationExecutor介面帶多種條件查詢

DAO層繼承JpaSpecificationExecutor介面@Overridepublic Page<AbnormalEntity> fetchAbnormals(QueryCondition query,Integer page,Integer rows)

springboot jpa mongodb 多條件查詢

sort ndt int integer mongod nbsp boot amp success public Page<Recorded> getRecordeds(Integer page, Integer size, Recorded recorded)

JPA查詢條件查詢

1.8 art array ESS valueof previous sof clas sql 情有獨鐘的JPA 平時在寫一些小項目時,比較喜歡引用 Spring Data Jpa,其實還是圖他寫代碼快~在日常的開發工作中,分頁列表查詢基本是隨處可見,下面一起看一下如

bos 第4 (區域excel批量導入、區域通用查詢區的添加、區多條件查詢區導出excel)

sea htm 不能 長安 基金會 格式 address ret body BOS項目筆記 第4天 今天內容安排: 1、區域批量導入功能 jQuery OCUpload(一鍵上傳插件)、apache POI、pinyin4j 2、實現區域的分頁查詢 3、對分頁代碼重構

模糊查詢Spring Data JPA 如何進行模糊查詢(LIKE) ?

定義 repos ppi -- data art dao層 sql語句 pos 原文詳見-----> https://blog.csdn.net/czx1204/article/details/79131281 一. 方法一 1. Controller層: 方

Spring Data Jpa框架自定義查詢語句返回自定義實體的解決方案

在使用Spring Data Jpa框架時,根據業務需求我們通常需要進行復雜的資料庫查詢,並返回我們自定義的實體類,而在該框架下,目前僅僅支援返回與資料庫對映進行持久化的POJO實體。雖然在框架上我們可以使用@Query註解執行我們自定義的sql語句,但是其返回值為List<Object[

SpringDataJPA Example條件查詢例項

文章參考了:https://blog.csdn.net/long476964/article/details/79677526  。該文章介紹了 Example 類的用法(中文不好看過來)。 SpringDataJPA官方文件:https://docs.spring.io/spring

條件查詢

只有繼承JpaSpecificationExecutor<>類,才能多條件分頁查詢。 eg: @Override public Page<OrderHistory> findAll(Pageable pageable, Long userId,

關於mongoTemplate的條件查詢封裝方法

先上實體類 @Document @Data        //lombok外掛 public class Profile { @Id private String id; @Indexed

springMVC+spring+mybatis 框架下查詢

一、Mapper.xml(xml) <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://

組合條件查詢

第一種: var url="${pageContext.request.contextPath }/fenYe?currentPage="+pageNumber+"&queryName=${queryName}&queryAddress=${queryAddress}&quer