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

轉自:https://blog.csdn.net/lsk12162012/article/details/50442792  java

spring-data-jpa 是對數據庫訪問的簡化的封裝,能夠幫助咱們更加方便的實現對數據庫的各類操做。Spring Data JPA 規範方法的名字,根據符合規範的名字來肯定方法須要實現什麼樣的邏輯,無須要咱們過多關注sql等。通常狀況下,對於單表操做很是方便,而涉及到多條件或者多表聯查時相對複雜一些。這裏簡單記錄一下jpa多條件查詢的相關api。git

       多條件分頁查詢:其中User爲查詢條件對象spring

[java]  view plain  copy
 
  1. public Page<User> findByPage(final User user, int page, int pageSize) throws Exception {  
  2.         Sort sort = new Sort(Direction.DESC, "registerTime");  
  3.         PageRequest pageRequest =  new PageRequest(page, pageSize, sort);  
  4.           
  5.         return userDao.findAll(new Specification<User>(){  
  6.             @Override  
  7.             public Predicate toPredicate(Root<User> root,  
  8.                     CriteriaQuery<?> query, CriteriaBuilder builder) {  
  9.                 List<Predicate> predicates = new ArrayList<Predicate>();  
  10.                 if(null != user.getUserType()){  
  11.                     predicates.add(builder.equal(root.get("userType"), user.getUserType()));  
  12.                 }  
  13.                 if(null != user.getStatus()){  
  14.                     predicates.add(builder.equal(root.get("status"), user.getStatus()));  
  15.                 }  
  16.                 query.where(predicates.toArray(new Predicate[predicates.size()]));  
  17.                 return null;  
  18.             }  
  19.         }, pageRequest);  
  20.     }  

以上代碼表明:根據userType及status分頁查詢User表符合條件的記錄。userType,status是User的屬性字段sql

 

   多表聯查: Question, Grade, Subject數據庫

 

[java]  view plain  copy
 
  1. public Page<Question> questionList(final String keyword,final String knowledge,final String type,final String itemBankId,final String gradeId,final String subjectId,Pageable pageable) {  
  2.     Page<Question> question = questionDao.findAll(new Specification<Question>() {  
  3.         @Override  
  4.         public Predicate toPredicate(Root<Question> root, CriteriaQuery<?> query, CriteriaBuilder cb) {  
  5.             Predicate predicate = cb.conjunction();  
  6.             List<Expression<Boolean>> expressions = predicate.getExpressions();  
  7.             if (StringUtils.isNotBlank(keyword)) {  
  8.                 expressions.add(cb.like(root.<String>get("keyword"), "%"+keyword+"%"));           
  9.             }  
  10.             if (StringUtils.isNotBlank(knowledge)) {  
  11.                 expressions.add(cb.like(root.<String>get("knowledge"), "%"+knowledge +"%"));      
  12.             }  
  13.             if (NumberUtils.isDigits(type)) {  
  14.                 expressions.add(cb.equal(root.<String>get("type"), type));     
  15.             }  
  16.             if(StringUtils.isNotBlank(itemBankId)) {  
  17.                 expressions.add(cb.equal(root.<String>get("puuid"), itemBankId));          
  18.             }  
  19.             if(NumberUtils.isDigits(gradeId)) {  
  20.                 expressions.add(cb.equal(root.<Grade>get("grade").<Long>get("id"), NumberUtils.toLong(gradeId)));         
  21.             }  
  22.             if(NumberUtils.isDigits(subjectId)) {  
  23.                 expressions.add(cb.equal(root.<Subject>get("subject").<Long>get("id"), NumberUtils.toLong(subjectId)));     
  24.             }  
  25.             expressions.add(cb.equal(root.<Long>get("deleteBy"), 0));  
  26.             return predicate;  
  27.         }  
  28.     },pageable);  
  29.     return question;  
  30. }  


此操做爲多表聯查: root.<Subject>get("subject") .<Long>get("id")表示取Question的屬性subject對應的Subject對象的id字段的值,相似於sql中的join操做。express

       

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

 

[java]  view plain  copy
 
    1. public int findPageByQuery(final String sql,  
    2.             final Object[] parameters) {  
    3.         //em ==> EntityManager  
    4.         Session session = (Session) em.getDelegate();  
    5.         Query query = session.createQuery(sql);  
    6.         if (parameters != null) {  
    7.             for (int i = 0; i < parameters.length; i++) {  
    8.                 query.setParameter(i, parameters[i]);  
    9.             }  
    10.         }  
    11.         //獲取遊標  
    12.         ScrollableResults sr = query.scroll();  
    13.         sr.last();  
    14.         int totalCount = sr.getRowNumber();  
    15.         return totalCount + 1;  
    16.     }  
相關文章
相關標籤/搜索