ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • usage spring data jpa with query dsl
    SpringBoot 2019. 7. 14. 17:27
    반응형

    -- dependency

    <!-- query dsl dependency -->
    <dependency>
      <groupId>com.querydsl</groupId>
      <artifactId>querydsl-apt</artifactId>
    </dependency>
    
    <dependency>
      <groupId>com.querydsl</groupId>
      <artifactId>querydsl-jpa</artifactId>
    </dependency>
    
    <!-- plugin set-->
    <plugins>
     <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
     </plugin>
     <plugin>
      <groupId>com.mysema.maven</groupId>
      <artifactId>apt-maven-plugin</artifactId>
      <version>1.1.3</version>
     <executions>
      <execution>
       <goals>
        <goal>process</goal>
       </goals>
       <configuration>
        <outputDirectory>target/generated-sources/java</outputDirectory>
        <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
       </configuration>
      </execution>
     </executions>
     </plugin>
    </plugins>

    -- created databaseConfig.java

    @Configuration
    public class Databaseconfig {
        @Bean
        public JPAQueryFactory queryFactory(EntityManager em) {
            return new JPAQueryFactory(em);
        }
    }

     

    -- created entity [author <1 - *> book]

    // Entity Author
    @Getter
    @NoArgsConstructor(access = AccessLevel.PROTECTED)
    @Entity
    @Table
    public class Author{
        @Id
        private authorSeq;
        private long author;
        private String name;
    }
    
    // Entity Book
    @Getter
    @EqualsAndHashCode(of = {"bookSeq"}, callSuper = false)
    @Entity
    @Table
    public class Book{
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private long  bookSeq;
    	private String title;
        private String description;
        private LocalDate published;
        private long rate;
        
        @ManyToOne(fetch = FetchType.LAZY, optional = false)
        @JoinColumn(name = "authorSeq")
        private Author author;
    }

    - book DTO

    @Getter
    @NoArgsConstructor
    public class YoutubeDTO {
    
        private String name;
        private String title;
        private String description;
        private long rate;
        private LocalDateTime publiched;
       
        @QueryProjection
        @Builder
        public BookDTO(String name,
        		String title,
                String description,
                long rate,
                LocalDate published) {
            this.name = name;
            this.title = title;
            this.description = description;
            this.rate = rate;
            this.published = published;
        }
    }

    -- author repository

    @Repository
    public interface AuthorRepository extends JpaRepository<Author, Long>, 
    		QuerydslPredicateExecutor<Author> {
    }

    -- book repository

    public interface BookRepository extends JpaRepository<Book, Long>,
            BookRepositoryCustom,QuerydslPredicateExecutor<Book> {
    }

    -- custom repository

    public interface BookRepositoryCustom {
        Page<BookDTO> findRateTop(Pageable pageable);
    }

    -- implementation custom repository

    //평점 과 출판 일 을 기준으로 정렬 하여 페이징 처리하여 가져오도록 한다.
    @RequiredArgsConstructor
    public class BookRepositoryImpl implements BookRepositoryCustom{
        private final JPAQueryFactory queryFactory;
        @Override
        public Page<BookDTO> findRateTop(Pageable pageable) {
            QBook book = QBook.book;
            QAuthor author = QAuthor.author;
            QueryResults<BookDTO> result = queryFactory
                    .select(
                    Projections.fields(
                    BookDTO.class,
                      author.name,
                      book.title,
                      book.description,
                      book.rate,
                      book.published))
                    .from(book)
                    .leftJoin(author)
                    .on(author.authorSeq.eq(book.author.authorSeq))
                    .groupBy(book.author.authorSeq)
                    .orderBy(book.rate.asc(),book.published.desc())
                    .offset(pageable.getOffset())
                    .limit(pageable.getPageSize())
                    .fetchResults();
            return result.isEmpty() ? Page.empty() : 
            	new PageImpl<>(result.getResults(),pageable,result.getTotal());
        }
    }

     

    - Predicate 구현

    public class BookPredicate {
        public static Predicate byTitle(String title) {
    		QBook book = QBook.book;
            BooleanBuilder builder = new BooleanBuilder();
            return builder.and(book.title.likeIgnoreCase(title));
        }
    }

    - Predicate 사용

    @Slf4j
    @Service
    public class BookService {
        @Autowired
        private BookRepository bookRepository;
        
        @Override
        public Optional<Book> findByTitle(String title) {
            return bookRepository.findOne(BookPredicate.byTitle(title));
        }
    }

     

    반응형

    'SpringBoot' 카테고리의 다른 글

    spring controller async request process with executor  (0) 2019.10.05
    Java 8 Stream range  (0) 2019.08.24
    Spring Batch (정리)  (0) 2019.04.06
    json array convert to object list in java  (0) 2019.01.30
    Object List groupping and sorted by fields  (0) 2019.01.09
Designed by Tistory.