개발 일지/WIL
8주차
장진혁
2023. 4. 2. 21:07
이번 클론 코딩에서 가장 관심이 갔던 것은 복잡한 쿼리문이다.
클론코딩 전까지 데이터베이스에서 가지고는 데이터의
조건이 많지 않아서 JPA로 쉽게 가지고 올 수 있었다.
package com.example.seoulcultureport.repository;
import com.example.seoulcultureport.entity.CommentLike;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface CommentLikeRepository extends JpaRepository<CommentLike, Long> {
Optional<CommentLike> findByUseridAndBoardidAndCommentid(Long userid, Long boardid, Long commentid);
Optional<CommentLike> deleteByUseridAndBoardidAndCommentid(Long userid, Long boardid, Long commentid);
}
위에 코드를 보더라고 크게 많은 조건이 붙어있지 않아서
쉽게 데이터를 조작가능 했습니다.
하지만 클론코딩에서 데이터를 가지고 오는데 조건이 많이 붙어버려서
계속 오류가 발생해서
직접 쿼리문을 작성해서 데이터 조작을 했습니다.
package com.example.thundermarket.products.repository;
import com.example.thundermarket.products.entity.Product;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface ProductRepository extends JpaRepository<Product, Long> {
// isDone이 false이고 createdAt을 기준으로 내림차순으로 정렬한 product를 모두 가져오는 쿼리를 직접 적용.
@Query(value = "SELECT * FROM product WHERE is_done = false ORDER BY created_at DESC", nativeQuery = true)
List<Product> findAllByIsDoneFalseOrderByCreatedAtDesc();
// 같은 카테고리 게시물 최신순 6개를 불러온다. isDone이 false이고 주어진 productid값이 아닌 product를 limit개수만큼 가져오는 쿼리를 직접 적용.
@Query(value = "SELECT * FROM product WHERE is_done = false AND id != :productId AND cate_code = (SELECT cate_code FROM product WHERE id = :productId) ORDER BY created_at DESC LIMIT :limit", nativeQuery = true)
List<Product> findLatestNotDoneProductsByCategoryIdExceptGivenId(@Param("limit") int limit, @Param("productId") Long productId);
Page<Product> findAllByIsDoneFalse(Pageable page);
@Query(value = "SELECT count(*) FROM product WHERE is_done = false", nativeQuery = true)
Long countProducts();
// 제목과 내용에서 "keyword"가 포함된 상품을 검색하는 쿼리. cateCode가 0이면 카테고리와 상관없이 전체검색. cateCode가 들어오면 카테고리와 일치하는 상품만 검색
@Query("SELECT p FROM Product p WHERE (p.title LIKE %:keyword% OR p.desc LIKE %:keyword%) AND (:cateCode = 0 OR p.cateCode = :cateCode)")
Page<Product> findByTitleOrDescContainingAndCateCode(@Param("keyword") String keyword, @Param("cateCode") int cateCode, Pageable pageable);
}
우선적으로 느낀점은 공부해야 한다.
공부안하면 답이 없다.
JPA 책을 구입했다....
프로젝트로 시간이 없더라고 해야한다. 조금씩만 제발