1. 程式人生 > >spring-data-jpa 多條件查詢 學習記錄

spring-data-jpa 多條件查詢 學習記錄

          spring-data-jpa 是對資料庫訪問的簡化的封裝,可以幫助我們更加方便的實現對資料庫的各種操作。Spring Data JPA 規範方法的名字,根據符合規範的名字來確定方法需要實現什麼樣的邏輯,無需要我們過多關注sql等。一般情況下,對於單表操作非常方便,而涉及到多條件或者多表聯查時相對複雜一些。這裡簡單記錄一下jpa多條件查詢的相關api。

       多條件分頁查詢:其中User為查詢條件物件

public Page<User> findByPage(final User user, int page, int pageSize) throws Exception {
		Sort sort = new Sort(Direction.DESC, "registerTime");
		PageRequest pageRequest =  new PageRequest(page, pageSize, sort);
		
		return userDao.findAll(new Specification<User>(){
			@Override
			public Predicate toPredicate(Root<User> root,
					CriteriaQuery<?> query, CriteriaBuilder builder) {
				List<Predicate> predicates = new ArrayList<Predicate>();
				if(null != user.getUserType()){
					predicates.add(builder.equal(root.get("userType"), user.getUserType()));
				}
				if(null != user.getStatus()){
					predicates.add(builder.equal(root.get("status"), user.getStatus()));
				}
				query.where(predicates.toArray(new Predicate[predicates.size()]));
				return null;
			}
		}, pageRequest);
	}
以上程式碼代表:根據userType及status分頁查詢User表符合條件的記錄。userType,status是User的屬性欄位

   多表聯查: Question, Grade, Subject

public Page<Question> questionList(final String keyword,final String knowledge,final String type,final String itemBankId,final String gradeId,final String subjectId,Pageable pageable) {
    Page<Question> question = questionDao.findAll(new Specification<Question>() {
        @Override
        public Predicate toPredicate(Root<Question> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            Predicate predicate = cb.conjunction();
            List<Expression<Boolean>> expressions = predicate.getExpressions();
            if (StringUtils.isNotBlank(keyword)) {
                expressions.add(cb.like(root.<String>get("keyword"), "%"+keyword+"%"));         
            }
            if (StringUtils.isNotBlank(knowledge)) {
                expressions.add(cb.like(root.<String>get("knowledge"), "%"+knowledge +"%"));    
            }
            if (NumberUtils.isDigits(type)) {
                expressions.add(cb.equal(root.<String>get("type"), type));   
            }
            if(StringUtils.isNotBlank(itemBankId)) {
                expressions.add(cb.equal(root.<String>get("puuid"), itemBankId));        
            }
            if(NumberUtils.isDigits(gradeId)) {
                expressions.add(cb.equal(root.<Grade>get("grade").<Long>get("id"), NumberUtils.toLong(gradeId)));       
            }
            if(NumberUtils.isDigits(subjectId)) {
                expressions.add(cb.equal(root.<Subject>get("subject").<Long>get("id"), NumberUtils.toLong(subjectId)));   
            }
            expressions.add(cb.equal(root.<Long>get("deleteBy"), 0));
            return predicate;
        }
    },pageable);
    return question;
}

此操作為多表聯查: root.<Subject>get("subject") .<Long>get("id")表示取Question的屬性subject對應的Subject物件的id欄位的值,類似於sql中的join操作。

    另記錄一下利用遊標查詢記錄總數:

public int findPageByQuery(final String sql,
            final Object[] parameters) {
        //em ==> EntityManager
        Session session = (Session) em.getDelegate();
        Query query = session.createQuery(sql);
        if (parameters != null) {
            for (int i = 0; i < parameters.length; i++) {
                query.setParameter(i, parameters[i]);
            }
        }
        //獲取遊標
        ScrollableResults sr = query.scroll();
        sr.last();
        int totalCount = sr.getRowNumber();
        return totalCount + 1;
    }


相關推薦

spring-data-jpa 條件查詢 學習記錄

          spring-data-jpa 是對資料庫訪問的簡化的封裝,可以幫助我們更加方便的實現對資料庫的各種操作。Spring Data JPA 規範方法的名字,根據符合規範的名字來確定方

Spring data jpa 條件查詢條件為時間)

直接程式碼附上:SimpleDateFormat sdfmat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");try { if (StringUtils.isNotEmpty(startTime) && S

Spring Data JPA 條件查詢

Spring Data JPA 查詢很方便,但做搜尋功能時,條件都是未知的,並不能用方法命名的方式查詢,自己寫JPQL,用表示式的方式處理也不靠譜,條件多了簡直就是作死,以前寫過下面的程式碼:

Spring data jpa 查詢(二:表動態條件查詢

上一章說完單表動態條件查詢,這章就說下多表關聯查詢 1、先說一對多關係,就以上一章的A模型和B模型,為例 A 對應 多個 B,而現在需求就是查詢A和B關聯,並需要傳入的動態引數,可能是A模型中的屬性,也有可能是B模型中的引數 還是用虛擬碼來說明,並且用的是Specifi

快速學習Spring Data JPA -- 第六章JPA條件查詢

xl_echo編輯整理,交流學習請加1280023003 百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!! 在Springle Data JPA中,我們看到了JPA由於不需要寫SQL給我們簡化了很多的工作。同時JPA的特性,讓我們對資料層面的操作

spring data jpa 表UNION ALL查詢條件排序分頁處理:未搜到方法,解決後記錄:2018年11月13日15:22:00

需求:Mysql資料庫 有不同屬性的兩張表,需要進行按某個條件查詢,結果合併排序分頁。 讓產品把兩個表分成兩段展示各查各的,分開來。 產品經理說能實現:產品寫sql 聯合查詢, A UNION AL

Spring Data JPA 個實體類表聯合視圖查詢

test where part 左連接 lec 視圖 view new manytoone Spring Data JPA 查詢數據庫時,如果兩個表有關聯,那麽就設個外鍵,在查詢的時候用Specification創建Join 查詢便可。但是只支持左連接,不支持右連接,雖說左

Spring Data Jpa表聯合分頁查詢

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

spring data jpa 對一聯表查詢

資料庫: 實體類: public class Product { @Id @GeneratedValue private Long id; private String name; private Double pri

spring-data-jpa 介紹 複雜查詢,包括表關聯,分頁,排序

本篇進行Spring-data-jpa的介紹,幾乎涵蓋該框架的所有方面,在日常的開發當中,基本上能滿足所有需求。這裡不講解JPA和Spring-data-jpa單獨使用,所有的內容都是在和Spring整合的環境中實現。如果需要了解該框架的入門,百度一下,很多入門的介紹。在這篇

Spring Data 系列學習Spring Data JPA @Query 註解查詢

# 【Spring Data 系列學習】Spring Data JPA @Query 註解查詢 前面的章節講述了 Spring Data Jpa 通過宣告式對資料庫進行操作,上手速度快簡單易操作。但同時 JPA 還提供通過註解的方式實現,通過將 `@Query` 註解在繼承 repository 的介面類

Spring Data JPA 實例查詢

customer 數據庫表 查詢方式 記錄 如何 三、認識“實例查詢” 1、概念定義: 上面例子中,是這樣創建“實例”的:Example<Customer> ex = Example.of(customer, matcher);我們看到,Example對象,由custom

spring data JPA各種套路深入學習

  基本查詢 基本查詢也分為兩種,一種是spring data預設已經實現,一種是根據查詢的方法來自動解析成SQL。 預先生成方法 spring data jpa 預設預先生成了一些基本的CURD的方法,例如:增、刪、改等等 1 繼承JpaRepository pu

Spring Data JPA 資料來源的使用

1    第3-6課:Spring Data JPA 多資料來源的使用 專案中使用多個數據源在以往工作中比較常見,微服務架構中不建議一個專案使用多個數據源。在微服務架構下,一個微服務擁有自己獨立的一個數據庫,如果此微服務要使用其他資料庫的資料,需要呼叫對應庫的微服務介面來呼叫,

spring data jpa 分頁查詢

法一(本地sql查詢,注意表名啥的都用資料庫中的名稱,適用於特定資料庫的查詢) public interface UserRepository extends JpaRepository<User, Long> { @Query(value = "SE

spring data elasticsearch 索引查詢(切換索引)

最近在做專案的時候,遇到一個問題,要訪問不同索引(可以當成分庫去理解),如果是用直接請求的方式很容易做到,但是用了spring-data-elasticsearch好像不是很好實現,在網上看到基本上都是indexName直接賦值。如果也有這樣需求的可以試試我的方法,下面就具體

Spring-Data-JPA 自定義查詢方法底層如何處理

public interface UserDao extends JpaRepository<User, Integer>{         //自定義查詢 /** * 方法簽名已經告訴spring-data-jpa足夠的資訊來建立這個方法的實現了 * spri

Spring Data JPA之動態查詢

在日常工作中,Spring Data JPA的使用給我們帶來了極大的方便,但是實際業務中很多場景需要支援動態查詢。比如前端查詢功能提供了很多查詢條件,使用者可以根據一部分條件進行查詢,那麼後端就需要支援可配置的查詢服務。在使用mybatis等時,可以用動態查詢的方式輕鬆搞定,

springboot結合spring-data-jpa的動態查詢

Criteria API 這套API可用於構建對資料庫的查詢。型別安全。通過定義元資料模型,在程式編譯階段就可以對型別進行檢查,不像SQL需要與Mysql進行互動後才能發現型別問題。 如下即為元資料模型。建立一個元模型類,類名最後一個字元為下劃線,內部的成員變數與Girl.

Spring data jpa的高階查詢的應用和底層原理分析

spring data jpa的查詢 目前比較簡單的查詢: 三種查詢方案的寫法 固定引數查詢 interface XxxRepo implements JpaRepository<T,Long>{ EntityXxx findByNameAnd