JPA查詢之Specification以及HQL、SQL查詢


1、Specification


    
    
   
   
           
  1. //查詢條件List
  2. List<Predicate> predicateList = new ArrayList<Predicate>();
  3. Specification specification = new Specification() {
  4. @Override
  5. public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) {
  6. //root即是Join<>內部第一個泛型的類型,意思就是用SkuProduct與Picture通過SkuProduct的pictures左聯
  7. Join<SkuProduct,Picture> skuProductPictureJoin = root.join( "pictures",JoinType.INNER);
  8. //添加第1個查詢條件:SkuProduct的code等於skuProduct.getCode(),然后將這個criteriaBuilder的條件添加到predicateList
  9. predicateList.add(criteriaBuilder.equal(root.get( "code"),skuProduct.getCode()));
  10. //添加第2個條件
  11. predicateList.add(criteriaBuilder.notEqual(skuProductPictureJoin.get( "pictureType"), 0));
  12. //返回
  13. return criteriaBuilder.and(predicateList.toArray( new Predicate[predicateList.size()]));
  14. }
  15. };
  16. // 重要說明:Specification不支持右連接!
  17. //Specification specification = new Specification() {
  18. // @Override
  19. // public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) {
  20. // Join<Picture,SkuProduct> skuProductPictureJoin = root.join("pictures",JoinType.RIGHT);
  21. // predicateList.add(criteriaBuilder.notEqual(root.get("pictureType"),0));
  22. // predicateList.add(criteriaBuilder.equal(skuProductPictureJoin.get("code"),skuProduct.getCode()));
  23. // return criteriaBuilder.and(predicateList.toArray(new Predicate[predicateList.size()]));
  24. // }
  25. //};
  26. List<SkuProduct> results = skuProductRepository.findAll(specification);
  27. if(results!= null){
  28. results.stream().forEach(result->{
  29. System.out.println(result);
  30. });
  31. }


2、HQL


    
    
   
   
           
  1. @Query(value = "SELECT p FROM Picture p WHERE p.code= :code")
  2. List<Picture> findByPicture(@Param(value = "code") String code);

3、SQL

3.1--:占位符

    
    
   
   
           
  1. @Query(value = "SELECT p.* FROM picture p LEFT JOIN sku_product_pictures sp_p ON p.id=sp_p.pictures_id LEFT JOIN sku_product sp ON sp_p.sku_product_id=sp.id WHERE sp.code= :code AND p.picture_type=0",nativeQuery = true)
  2. List<Picture> findBySkuProductCodeAndPicture(@Param(value = "code") String code);


3.2--?占位符

    
    
   
   
           
  1. @Query(value = "SELECT p.* FROM picture p LEFT JOIN sku_product_pictures sp_p ON p.id=sp_p.pictures_id LEFT JOIN sku_product sp ON sp_p.sku_product_id=sp.id WHERE sp.code=?1 AND p.picture_type=?2",nativeQuery = true)
  2. List<Picture> findSkuProductCodeAndPicture(String code,int pictureType);



版權聲明:本文為博主原創文章,未經博主允許不得轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM