SringBoot 학습의 Jpa는 주로 사용자 정의 조회와 조건 결합과 페이지 나누기

6184 단어
  • 먼저 실체 클래스를 만들고 주석을 달고 실행하면 자동으로 지정한 데이터베이스에 데이터 테이블을 만든다.
  • 프로필 교환.yml, 이런 격식은 차원이 명확하고 군더기가 쉽지 않다.데이터베이스에 연결하다.
  • dao 인터페이스를 써서 JpaRepository를 계승하면 사용자 정의 방법을 스스로 추가할 수 있습니다.데이터베이스를 조작할 수 있다.@Query 쿼리 사용자 정의
  • dao에 사용자 정의 조회 방법 쓰기
    /*
               
    */
    @Query("select b from Book b where b.name like %?1%") //  hql(    ),Book    ,?1       ,    %            
    public List findByName(String name);
    
    /*
      sql
    */
    @Query(value = "select * from book b where b.name=?1", nativeQuery = true)
    List findByName(String name);
    
    /*
                 
    */
    @Query(value="select * from t_book order by RAND() limit ?1",nativeQuery = true) //   false,      sql   
    public List randomList(Integer n);
    
    @Query(value = "select name,author,price from Book b where b.price>?1 and b.price2")
    List findByPriceRange(long price1, long price2);
    
    @Query(value = "select name,author,price from Book b where b.name like %:name%")
    List findByNameMatch(@Param("name") String name);
    
    @Query(value = "select * from book b where b.name=?1", nativeQuery = true)
    List findByName(String name);
    
    /*
      @Param      
    */
    @Query("select name,author,price from Book b where b.name=:name and b.author=:author and b.price=:price")
    List findByNamedParam(@Param("name")String name,@Param("author")String author,@Param("price")String price);
    
  • like 문장에 대해 매개 변수가null일 때 데이터를 찾을 수 없음;동적 조회는 모든 데이터를 얻을 수 있다
  • sql 문장 정의Predicate 동적 조회, 조건 결합
  • 을 사용하는 것을 권장합니다.
  • 아래는findAll을 확충하여 동적 조회를 진행한다.주로 검색 조건이 완비되지 않을 수도 있고, 때로는 공중검색도 할 수 있다. 공중검색을 하면 모든 기록을 찾아낼 수 있다
    public ModelAndView list2(Book book){ //    
    ModelAndView mav=new ModelAndView();
    List bookList=bookDao.findAll(new Specification(){
    
        /*
            
         */
        @Override
        public Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder cd) { //cb      ;query       ;root         
            Predicate predicate=cd.conjunction(); //conjunction:  
            //    null        
            if(book!=null){
                if(book.getName()!=null&&!"".equals(book.getName())){ //            
                    predicate.getExpressions().add(cd.like(root.get("name"),"%"+book.getName()+"%")); //cb.like(root.get("name"):      , like    ,     equal ;         
                }
                if(book.getAuthor()!=null&&!"".equals(book.getAuthor())){
                    predicate.getExpressions().add(cd.like(root.get("author"),"%"+book.getAuthor()+"%"));
                }
            }
            return predicate; //          
        }
    
    });
    
    mav.addObject("bookList",bookList);
    mav.setViewName("bookList");
    return mav;
    
    }
  • like 검색어 외에 다른 것이 있습니다:
    //    ,     
    predicate.getExpressions().add(cd.greaterThanOrEqualTo(root.get("createDate"), document.getFirstDate()));
    //    
    predicate.getExpressions().add(cd.lessThanOrEqualTo(root.get("createDate"), document.getLastDate()));
    
    조인트+페이지
  • 조립 조건을 제외하고는 보통 페이지를 나눈다.우리는 조건의 결합과 페이지 나누기를 동시에 실현하는 방법을 정의할 수 있다
    //dao 
    public interface DocumentRepository extends JpaRepository{
    
        Page findAll(Specification specification, Pageable pageable);
    }
    
    //service     
    public interface DocumentService {
    
        public Page findAll(UsefulDocument document, int pageNum, int pageSize);
    
    }
    
    //service   
    @Override
    public Page findAll(UsefulDocument document, int pageNum, int pageSize) { //         
    
        List orders = new ArrayList(); //    
        //             
        if (document.getFirstDate() != null) { 
            orders.add(new Sort.Order(Sort.Direction.DESC, "createDate"));
        } else if (document.getLastDate() != null) {
            orders.add(new Sort.Order(Sort.Direction.DESC, "createDate"));
        } else { //   id 
            orders.add(new Sort.Order(Sort.Direction.ASC, "id"));
        }
        //      
        Sort sort = new Sort(orders); 
        //      ,    、           
        Pageable pageable=new PageRequest(pageNum,pageSize,sort);
    
        //  findAll        (             )
        Page documentList = documentRepository.findAll(new Specification() { @Override …… }, pageable);
    
        //  ,     pageNum          
        return documentList;
    }
    
  • 그중의 Sort와 Order는 이렇게 사용한다. Sort는 정렬 방법이고 Order는 정렬 규칙을 정의한다.정렬 규칙이 하나밖에 없으면 이렇게 쓸 수 있다
    Sort sort=new Sort(Sort.Direction.ASC,"age"); //            (          )
    //           String    
    
  • 그런데 만약에 제가age를 누르고 그레이드를 누르고 dnum를 누르고 싶으면 어떻게 해요?
  • 이럴 때는 org를 써야 한다.springframework.data.domain.Sort.Order 이 가방 아래에 있는 Order 클래스가 있습니다
  • 정렬 규칙에 따라 우리는 각각 세 개의 Order를 다음과 같이 세운다.
    //    
    Sort.Order order1=new Sort.Order(Sort.Direction.DESC,"age");
    Sort.Order order2=new Sort.Order(Sort.Direction.ASC,"grade");
    Sort.Order order3=new Sort.Order(Sort.Direction.DESC,"dnum");
    //    
    List list=new ArrayList<>();
    list.add(order1);
    list.add(order2);
    list.add(order3);
    //  Sort 
    Sort sort=new Sort(list);
    
    정렬
    Iterable findAll(Sort sort);
    
  • 페이지별로 획득한 대상 집합은 사실 일반 집합과 마찬가지로 모든 스트리밍 방법으로 스트리밍할 수 있다
  • documentList.getTotalElements()//모든 조회 결과 총 행수, 롱형, 테스트 시 이렇게 판단해야 합니다: is(4L)//뒤에 L
  • 추가
  • documentList.getTotalPages()//조회 총 페이지 수
  • Document document = documentList.getContent ()//결과 객체 가져오기
  • documents.getNumberOfElements()//이 페이지의 결과 항목 수
  • documents.getNumber()//동상
  • documents.getSize()//페이지당 용량
  • documents.getSort()//정렬 방법: 필드 승/강하 코드 실례
  • D:/SpringBootJpa/BookDao, BookController, entity/Book(첨삭 수정 도서)
  • D:/civalWeb/LLCWEB/DocumentRepository、DocumentService、DocumentServiceImpl、DocumentRepositoryTest
  • 좋은 웹페이지 즐겨찾기