본문 바로가기

Java/Spring Jpa

(7)
QueryDSL 기능 QueryDSL의 **Predicate** 인터페이스로 조건문을 여러개를 구성하여 따로 관리할 수 있다. findOne(Predicate), findAll(Predicate) 주로 이 2개 메소드가 사용된다. findOne = Optional 리턴 findAll = List | Page | Iterable | Slice 리턴 Type Safe 기능 조건문 구성시에 사용되는 객체, 필드 조건이 실제 타입과 일치한지 체크해준다. 장점 문자가 아닌 코드로 쿼리를 작성함으로써, 컴파일 시점에 문법 오류를 쉽게 확인할 수 있다. 자동 완성 등 IDE의 도움을 받을 수 있다. 동적인 쿼리 작성이 편리하다. 쿼리 작성 시 제약 조건 등을 메서드 추출을 통해 재사용할 수 있다. 원리 QueryDSL 의존성을 추가..
정렬 컬럼값으로 정렬하기 sort class사용 Sort sort1 = Sort.by("name").descending(); // 내림차순 Sort sort2 = Sort.by("password").ascending(); // 오름차순 Sort sortAll = sort1.and(sort2); // 2개이상 다중정렬도 가능하다 Pageable pageable = PageRequest.of(0, 10, sortAll); // pageable 생성시 추가 컬럼이 아닌 값으로 정렬 // 아래와 같이 AS user_password 로 Alias(AS) 를 걸어주면 @Query("SELECT u, u.password AS user_password FROM user u WHERE u.username = ?1") List..
원하는 값만 쿼리로 가져오기 이전에 jpql로 원하는 값만 가져왔었는데, 다음과 같은 방법도 가능하다. @Repository @Transactional public class MyRepositoryImpl implements MyRepository { @Autowired EntityManager entityManager; @Override public List findNameAll() { return entityManager.createQuery("SELECT u.username FROM User AS u", String.class).getResultList(); } }
delete() 메서드 최적화 Spring data jpa의 delete() 메서드는 바로 삭제 쿼리를 날리지 않고 cascade, orphanRemoval 에 의한 자식도 삭제가 누락되지 않도록 영속성 상태인지 확인해서 영속성 컨텍스트에 없다면(!em.contains(entity)) 엔티티를 조회해서 영속성 상태로 바꾼다. 때문에 JpaRepository 의 delete() 는 해당 엔티티를 바로 삭제하지 않고, remove() 메소드를 통해 remove 상태로 바꾼다. 데이터를 영속 상태로 바꾸지 않고 바로 삭제 쿼리를 날리고 싶으면 다음과 같이 써주면 된다. @Repository @Transactional public class MyRepositoryImpl implements MyRepository { @Autowired En..
Repository 기능 제한 1.@RepositoryDefinition 을 인터페이스에 붙이는법 @RepositoryDefinition(domainClass = Comment.class, idClass = Long.class) public interface CommentRepository { Comment save(Comment comment); List findAll(); } 2.@NoRepositoryBean 인터페이스로 한번더 감싸는법 @NoRepositoryBean public interface MyRepository extends Repository { E save(E entity); List findAll(); } 일반적으로 1번 방법을 더 많이 쓴다고 한다.
Cascade와 orphanRemoval Cascade 사용 위치 연관관계의 주인 반대편 - 부모 엔티티(다대일에서 일) 즉, @OneToMany 가 있는 쪽 또는 @OneToOne 도 가능 예를들어, 게시글과 첨부파일이라면 일에 해당하는 게시글에 설정한다. 사용 조건 양쪽 엔티티의 라이프사이클이 동일하거나 비슷해야한다. 예를들어, 게시글이 삭제되면 첨부파일도 같이 삭제 되어야 한다. 대상 엔티티로의 영속성 전이는 현재 엔티티에서만 전이 되어야 한다. (다른곳에서 또 걸면 안됨) 예를들어, 첨부파일을 게시글이 아닌 다른곳에서 영속성 전이를 하면 안된다. 옵션 종류 ALL : 전체 상태 전이 PERSIST : 저장 상태 전이 REMOVE : 삭제 상태 전이 MERGE : 업데이트 상태 전이 REFERESH : 갱신 상태 전이 DETACH : 비영..
복합키 사용하기 Spring jpa에서 복합키를 사용하기 위한 방법은 두가지가 있다. 1. @Idclass 사용 UserChannel.java @Entity @IdClass(UserChannelId.class) public class UserChannel { .... @Id @ManyToOne @JoinColumn(name = "user_id") User user; @Id @ManyToOne @JoinColumn(name = "channel_id") Channel channel; ... } UserChannelId.java @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class UserChannelId implements Serializable {..