이번에 jpa쪽 조인에 대해서 알게 되었는데요. 생각보다 조금 어려웠습니다. 아직 db 설계에 대해서는 많이 미숙한듯 합니다. 진짜 db를 여러번 고쳤습니다.
내일은 프론트단을 완성시켜 장바구니리스트를 보이도록 할겁니다.
p.s 현재 회사에서는 procedure를 사용해서 직접쿼리문으로 join을 했습니다. 회사의 테이블이 엄청나게 많고 너무 복잡하다보니 db쪽에 종속되는 방향으로 개발들이 되어 있습니다. (sql mapper 방식) 제 개인프로젝트는 orm 방식으로 했고요. 상당히 많은 it 회사들이 orm 방식으로 개발해서 일단 이쪽으로 공부를 하고 있습니다. 아직 모르는게 많고 배울게 엄청나게 많다고 느끼고 있습니다.
장바구니 리스트를 뽑아줄 jpa
//장바구니 리스트
public List<BasketsWithProduct> findAll(String userName,String status, int page, int size) {
List<BasketsWithProduct> basketsList = null;
EntityManager entityManager = entityManagerFactory.createEntityManager();
try{
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<BasketsWithProduct> criteriaQuery = criteriaBuilder.createQuery(BasketsWithProduct.class);
Root<Baskets> root = criteriaQuery.from(Baskets.class);
Join<Baskets, Product> fileJoin = root.join("product", JoinType.INNER);
// 복합키 검색 조건 생성
Predicate compositeKeyPredicate = criteriaBuilder.equal(root.get("basketId").get("usersId"),userName );
// 상태 검색 조건 생성
Predicate statusPredicate = criteriaBuilder.equal(root.get("status"), status);
// 검색 조건 결합
Predicate finalPredicate = criteriaBuilder.and(compositeKeyPredicate, statusPredicate);
//검색
criteriaQuery.select(criteriaBuilder.construct( BasketsWithProduct.class, root, fileJoin ));
criteriaQuery.where(finalPredicate);
TypedQuery<BasketsWithProduct> typedQuery = entityManager.createQuery(criteriaQuery);
typedQuery.setFirstResult((page - 1) * size);
typedQuery.setMaxResults(size);
// 페이지 조건
basketsList = typedQuery.getResultList();
}catch (Exception e){
e.printStackTrace();
}finally {
if(entityManager!=null){
entityManager.close();
}
}
return basketsList;
}
BasketsWithProduct 객체
@Getter
@Setter
public class BasketsWithProduct {
private Baskets baskets;
private Product product;
public BasketsWithProduct(Baskets baskets, Product product) {
this.baskets = baskets;
this.product = product;
}
}
장바구니쪽을 조금 생각을 해봤는데요. db쪽을 좀더 바꿀것 같습니다. 기존에는 주문상품들이 있는지 확인해서 카운팅만 업데이트 해주려고 했는데요. 곰곰히 생각해보니 데이터를 insert를 쭉 시키고 어차피 update에서 상태만 바꿔줄거여서 db를 다시한번 변경해야할듯합니다. 현재 코드 상태 :(변경 예정)
@PostMapping("/Basket/Post")
public ResponseEntity<?> PostBaskets(@RequestBody Baskets baskets, HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("user") == null) {
// 세션에 사용자 정보가 없으면 로그인 페이지로 리다이렉트
return ResponseEntity.badRequest().build();
}
//유저
String userId="";
Object attribute = session.getAttribute("user");
if (attribute instanceof org.springframework.security.core.userdetails.User) {
org.springframework.security.core.userdetails.User user = (org.springframework.security.core.userdetails.User) attribute;
// notice.setUsername(user.getUsername());
userId=user.getUsername();
}
baskets.getBasketId().setUsersId(userId);
//날짜
LocalDateTime currentDateTime = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
String formattedDateTime = currentDateTime.format(formatter);
baskets.getBasketId().setDate(formattedDateTime);
//TODO
//날짜 갯수카운팅 후 데이터 변경 상품, 유저아이디 체크할것
baskets.setCount(1L);
try{
basketService.save(baskets);
}catch (Exception e){
return ResponseEntity.badRequest().build();
}
return ResponseEntity.ok().build();
}