조인 전략 엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본키를 받아서 기본키 + 외래키로 사용하는 전략이다. 예시 Item.java (부모 테이블) package com.book.jpa.chapter07.JoinedStrategy.joined; import javax.persistence.*; @Entity @Inheritance(strategy = InheritanceType.JOINED) // 상속 매핑은 부모 클래스에 해당 어노테이션을 써야한다. 매핑전략 지정 @DiscriminatorColumn(name = "DTYPE") // 부모 클래스에 구분 컬럼을 지정한다. 이 컬럼으로 저장된 자식 테이블을 구분한다. public abstract class Item { @Id @Gen..
상황 Member, Category, Member_Category 총 3개의 테이블이 있다. 위 테이블을 보면 아래 컬럼 3개가 중복된다. 1) reg_dts 2) mod_dts 3) is_deleted JPA 클래스 상속으로 중복 컬럼 처리 BaseEntity.java package com.api.plan.entity.base; import javax.persistence.MappedSuperclass; @MappedSuperclass public abstract class BaseEntity { private String regDts; private String modDts; private String isDeleted; } Member.java package com.api.plan.entity; i..
페이징 처리 /* paging */ Page findByName(String name, Pageable pageable); 호출 System.out.println("findByName : " + userRepository.findByName("test1" , PageRequest.of(0, 1, Sort.by(Sort.Order.desc("id"))))); // getContent System.out.println("findByName : " + userRepository.findByName("test1" , PageRequest.of(0, 1, Sort.by(Sort.Order.desc("id")))).getContent()); findAll() 메서드 호출 Page users = userReposit..
Order BY ID DESC List findTopByNameOrderByIdDesc(String name); Order BY ID DESC (Limit 3) List findTop3ByNameOrderByIdDesc(String name); // 역순 TopN 중 N을 생략하면 1이 default 값이다 List findTopByNameOrderByIdDesc(String name); Order BY ID ASC (Limit 1) List findTop1ByNameOrderByIdAsc(String name); // 정순 여러 컬럼의 정렬 (Id Desc, Email Asc) List findFirstByNameOrderByIdDescEmailAsc(String name); // id desc, em..
like 'TEXT%' List findByNameStartingWith(String name); like '%TEXT' List findByNameEndingWith(String name); like '%TEXT%' List findByNameLike(String name); 호출 코드 (파라미터에 직접 '%test%'를 넣어줘야한다.) userRepository.findByNameLike("%test%") Contains List findByNameContains(String name); 호출 코드 (파라미터에 직접 '%test%'를 넣어줄 필요가 없다.) userRepository.findByNameLike("test")
NotNull List findByIdIsNotNull(); // id is not null NotEmpty List findByAddressIsNotEmpty(); 주의해야할점 String 타입의 변수의 경우 (findByNameIsNotNull()) NAME IS NOT NULL AND NAME != '' 라고 생각할 수 있겠지만, 이게 아니다. User.java 에 아래 코드를 추가한다. private List address; Collection Type 의 not empty 를 체크한다. (address not empty)
Between (LocalDate Type, Long Type 모두 가능) LocalDateTime 타입 변수 List findByCreatedAtBetween(LocalDateTime startDateTime, LocalDateTime endDateTime); long 타입 변수 List findByIdBetween(long startId, long endId); Between~And List findByIdGreaterThanEqualAndIdLessThanEqual(Long id1, Long id2); 실행쿼리 findByIdBetween 메서드와 동일하게 구현된다. between (id>=? AND id
Date After List findByCreatedAtAfter(LocalDateTime yesterday); Date GreaterThan List findByCreatedAtGreaterThan(LocalDateTime yesterday); 실행쿼리 created_at > ? Date GreaterThanEqual List findByCreatedAtGreaterThanEqual(LocalDateTime yesterday); 실행쿼리 created_at >= ? Date Before List findByCreatedAtBefore(LocalDateTime yesterday);
WHERE~AND절 /* WHERE AND */ List findByEmailAndName(String email, String name); WHERE~OR절 /* WHERE OR */ List findByEmailOrName(String email, String name);
전체 리스트 조회 List userList = userRepository.findAll(); 전체 리스트 조회 + regDts 컬럼 역순 정렬 List userList = userRepository.findAll(Sort.by(Sort.Direction.DESC, "regDts")); 데이터 단건 조회 (1) Long Type Id : 1 Optional userOptional = userRepository.findById(1L); Optional 리턴 https://devfunny.tistory.com/330 자바 8의 Optional 등장 NullPointerException NullPointerException은 개발자가 한번이라도 만나봤을 에러이다. 그정도로 흔하게 일어나는 에러로, 이는 “자바의..
영속성 컨텍스트 JPA에서 영속성 컨텍스트란, 엔터티를 영구 저장하는 환경을 말한다. 영속성 컨텍스트는 우리가 개발하면서 직접 관리할 수 없다. 영속석 컨텍스트는 논리적인 개념이고 눈에 보이지 않는다. 엔터티 매니저를 통해서 영속성 컨텍스트에 접근이 가능하다. EntityManager.persist(entity); 영속성 컨텍스트 엔티티의 생명주기 1) 비영속 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 2) 영속 영속성 컨텍스트에 관리되는 상태 3) 준영속 영속성 컨텍스트에 저장되었다가 분리된 상태 4) 삭제 영속성 컨텍스트에서 삭제된 상태 생명주기 관리 비영속 상태 Member member = new Member(); Member.setId(“aa”); 영속 상태 Member member = ne..
SQL 중심의 개발 SQL 중심의 개발에서는 개발자가 직접 SQL 매핑을 한다. 각 테이블의 관계성을 생각하여 쿼리를 짜고, 비즈니스 로직을 수행하기 위해 단계별로 쿼리를 실행시킨다. 부모 테이블 -> 자식 테이블 까지의 데이터 등록이 필요하다면 INSERT 쿼리를 여러개 수행하게 되고, 각 테이블의 연관관계 (PK, FK) 의 조인도 개발자가 직접 설계한다. 객체지향적으로 설계할수록, SQL 작업은 더 복잡해지고 힘들어진다. 매핑 작업이 늘어나게되고, 개발자가 직접 해야하는 일들이 늘어나기 때문에 그에 따른 책임감이 더욱 발생하게된다. JPA 만약, 객체를 자바 컬렉션(Map, List) 에 저장하듯이, DB에 저장할 수는 없을까? 이러한 생각을 바탕으로 나온 것이 바로 JPA이다. ORM JPA를 알..