1. 程式人生 > >Spring Data Jpa 進行原生Sql 分頁和條件查詢

Spring Data Jpa 進行原生Sql 分頁和條件查詢

因為業務的原因今天寫了一個原生的Spring Data jpa的分頁查詢 :

1 .進行封裝自己PageQuery:
    public class PageQuery {

    public Integer getPage() {
        return page - 1;
    }

    public void setPage(Integer page) {
        this.page = page;
    }

    public Integer getSize() {
        return size;
    }

    public void
setSize(Integer size) { this.size = size; } @NotNull(message = "引數不允許為空") private Integer page = 1; // 預設為1 @NotNull(message = "引數不允許為空") private Integer size = 20; }
  1. 進行封裝 PageBean .
import java.util.List;
public class PageBean<T> {
    private Long totalCount; // 總記錄數
private List<T> pageData; // 每頁記錄數 public Long getTotalCount() { return totalCount; } public void setTotalCount(Long totalCount) { this.totalCount = totalCount; } public List<T> getPageData() { return pageData; } public void setPageData
(List<T> pageData) { this.pageData = pageData; } }
  1. 進行封裝自己的查詢引數:這個就不再多說了 。

  2. SpingMVC controller

    //所有的終端與車輛關聯的資訊
    @RequestMapping("/vehicleAndTerminal.json")
    @ResponseBody
    public HashMap<String, Object> vehicleAndTerminal(PageQuery pageQuery, Terminal terminal){

        return  terminalService.vehicleAndTerminal(pageQuery, terminal);
    }
  1. 進行業務層程式碼 :
    5.1 注入entityManagerFactory
@Autowired
    private LocalContainerEntityManagerFactoryBean entityManagerFactory;

5.2 進行原生的Sql 拼接

// 此處用了原生的sql拼接
    // 有Sql注入的風險
    @Override
    public HashMap<String, Object> vehicleAndTerminal(PageQuery pageQuery, Terminal terminal) {
        HashMap<String, Object> map = new HashMap<String, Object>();
        String sql = "SELECT * FROM terminal t WHERE t.vSn IS NOT NULL AND t.vSn!=''";
        Integer page = pageQuery.getPage();
        Integer size = pageQuery.getSize();

        String vSn = terminal.getvSn();
        if (vSn != null) {
            sql += "AND t.vSn=" + vSn + " ";
        }
        String vin = terminal.getVin();
        if (vin != null) {
            sql += "AND t.vin=" + vin + " ";
        }
        String num = terminal.getNum();
        if (num != null) {
            sql += "AND t.num=" + num + " ";
        }
        String barcode = terminal.getBarcode();

        if (barcode != null) {
            sql += "AND t.barcode=" + barcode + " ";
        }
        sql += "LIMIT" + " " + page + "," + size;
        EntityManager em = entityManagerFactory.getNativeEntityManagerFactory().createEntityManager();
        Query nativeQuery = em.createNativeQuery(sql, Terminal.class);
        @SuppressWarnings({ "unused", "unchecked" })
        List<Terminal> termins = nativeQuery.getResultList();
        if (em != null) {
            em.close();
        }
        map.put("total", termins.size());
        map.put("rows", termins);
        return map;
    }

這樣就實現了動態查詢 ,以及分頁。 上面的程式碼 我自己封裝的PageBean 沒有用上 ,下面的程式碼是改過的

public PageBean<Terminal> vehicleAndTerminal(PageQuery pageQuery, Terminal terminal) {
        HashMap<String, Object> map = new HashMap<String, Object>();
        String sql = "SELECT * FROM terminal t WHERE t.vSn IS NOT NULL AND t.vSn!=''";
        Integer page = pageQuery.getPage();
        Integer size = pageQuery.getSize();

        String vSn = terminal.getvSn();
        if (vSn != null) {
            sql += "AND t.vSn=" + vSn + " ";
        }
        String vin = terminal.getVin();
        if (vin != null) {
            sql += "AND t.vin=" + vin + " ";
        }
        String num = terminal.getNum();
        if (num != null) {
            sql += "AND t.num=" + num + " ";
        }
        String barcode = terminal.getBarcode();

        if (barcode != null) {
            sql += "AND t.barcode=" + barcode + " ";
        }
        sql += "LIMIT" + " " + page + "," + size;
        EntityManager em = entityManagerFactory.getNativeEntityManagerFactory().createEntityManager();
        Query nativeQuery = em.createNativeQuery(sql, Terminal.class);
        @SuppressWarnings({ "unused", "unchecked" })
        List<Terminal> termins = nativeQuery.getResultList();
        if (em != null) {
            em.close();
        }
        // map.put("total", termins.size());
        // map.put("rows", termins);
        // return map;

        PageBean<Terminal> pageBean = new PageBean<>();

        pageBean.setTotalCount((long) termins.size());

        pageBean.setPageData(termins);

        return pageBean;
    }

相關推薦

Spring Data Jpa 進行原生Sql 條件查詢

因為業務的原因今天寫了一個原生的Spring Data jpa的分頁查詢 : 1 .進行封裝自己PageQuery: public class PageQuery { pub

Spring Data Jpa多表聯合查詢

參考:https://blog.csdn.net/qq_36144258/article/details/80298354 近期一個專案用到Spring Data Jpa,Jpa用來做單表查詢非常的簡單粗暴,可以說不用寫sql,但是涉及到複雜的多表操作,還是要寫sql,這個時候需要用到@Quer

spring data jpa 中@Query註解pageable查詢

持有層程式碼:Repository @Query(value = "select * from user_liveapp where user_Id = :userId ORDER BY ?#{#pageable}", nativeQuery = true) Page&

Spring Data JPA的Pageable物件,實現對已查詢出list的

Pageable物件       但是有一種情況就是,pageable無法對已查詢出資料的list結果進行分頁,這在實際開發中幾乎不可避免,很多複雜業務,出於簡化開發或者考慮實際的原因,不可能通過一個sql查詢實現需求,肯定會對查詢出的list資料進行過濾,而這時pag

spring-data-jpa動態拼接sql語句實現動態的多表條件查詢

** spring-data-jpa 動態拼接sql語句 ** spring-data-jpa對於簡單的資料操作確實使用起來比較方便,但是對於一些比較複雜的動態的多表條件查詢就不是那麼簡單了,對於需要些sql語句並且需要動態的新增條件的時候就得使用jpa的EntityManager來

SpringBoot學習(三)--構建RESTFUL API並用spring-data-jpa進行儲存&&使用IDEA反向生成帶註釋的例項

構造User物件(/domain),如果有資料庫的表可以直接使用IDEA反向生成例項的類。過程如下: 開啟IDEA:View-ToolWindows-Database。新增資料來源,選擇資料庫型別,輸入資料庫的ip。如果不是預設Windows登陸資料庫,則取消勾選然後填入使用者名稱,密碼。

使用spring data 對mongodb實現簡單

//對某一書籍下的所有dxh按訪問量排序並分頁 public List<CKDXH> getPartitionDXHCKCountByBookIdandDes(Integer bookId,Integer start,Integer pagesize){

spring boot JPA Kotlin 使用QueryDsl 查詢

介紹 QueryDsl 是一個針對Java的面向物件查詢的工具,支援的模組有JPA,SQL,Mongodb,JDO,Lucense,集合。 sample List<Person> persons = queryFactory.selectFrom(person)

spring boot jpa 使用原生sql查詢,特此記錄。

 嗯哼,2018年7月18號特此記錄,使用java spring boot + jpa 開發後端,進行資料庫增刪改查(使用原生sql)進行。因為是第一次寫,僅僅是為了記錄,方便以後檢視,寫的不好還請見諒。 package com.jony.keer.repository;

MyBatis SQL處理及查詢總數據量

batis ger 分頁 var index add and resultmap ted 查詢數據總數:<select id="selectCount" resultType="java.lang.Integer"> <!-- WAR

SpringBoot第四講擴充套件封裝Spring Data JPA(一)_自定義Repository建立自己的BaseRepository

這一講主要介紹Spring Data JPA的封裝。和設計相關的東西都是仁者見仁,智者見智的事情,如果你有更好的封裝方案可以和我交流,互相學習。這一講會講如下一些內容 - 擴充套件Spring Data JPA實現自己的一些特殊方法 - 建立一個自己的Bas

JPA條件查詢聯表查詢

一、分頁多條件查詢–重寫Specification的toPredicate方法 Spring Data JPA支援JPA2.0的Criteria查詢,相應的介面是JpaSpecificationExecutor。 Criteria 查詢:是一種型別安全和更面

spring data jpa 裡 Dao層中RepositoryJpaSpecificationExecutor的一個小坑

public interface LabelRepository extends Repository<Label, Lon

條件查詢

分頁查詢 當前頁 字符串 查詢 style ebean SQ lib ice 1 分頁查詢 1.1 分頁核心 設計一個用於封裝當前頁所有分頁相關的數據的PageBean對象,每次訪問根據PageBean對象顯示當前頁面信息 1.2 分頁的實現步驟 1)編寫分頁對象和實體對象

條件查詢

use click 刪除 UNC index child mage size data $.ajax({ url: ‘http://localhost:8486/WebService.asmx/GetUsert‘, typ

springboot專案,layui與pageHelper整合,列表條件查詢

一、前端頁面  重點:1、table.render初始化載入資料             2、reload查詢按鈕觸發,資料重新載入            

在mybatis中實現oracle模糊查詢

        今天在工作中,遇到一個業務需求,就是需要在oracle裡進行模糊查詢並分頁,SQL語句如下:        select m.label,m.building_loc_id,m.shape.minx x,m.shape.miny y from         

5.0其他WEB技術——模糊查詢結合例項

JAVAWEB文章索引點這裡 首先分頁的核心是寫一個PageBean物件,將頁面中要使用到的首頁、上頁、下頁、末頁、頁數、查詢出的內容等等進行一個封裝。然後轉發回到頁面中進行一個顯示。而模糊查詢的核心是對sql語句進行一個拼接,達到模糊匹配需要內容的效果。

springMVC、myBatis的物理高階查詢

最新專案用到springMVC和mybatis,分頁其實用一個RowBounds可以實現,但是高階查詢不好封裝, 經過反覆測試,總算搞出來了,感覺封裝的不是很好,有待優化和提高! 原理:利用mybatis自定義外掛功能,自定義一個攔截器,攔截需要分頁的sql

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

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