JPA
-
Querydsl - 조인JPA/Querydsl 2023. 8. 13. 00:03
조인 - 기본 조인 첫 번째 파라미터에 조인 대상을 지정, 두 번째 파라미터에 별칭으로 사용할 Q타입을 지정하면 된다. /** * 팀 A에 소속된 모든 회원 */ @Test public void join() { List result = queryFactory .selectFrom(member) .join(member.team, team) .where(team.name.eq("teamA")) .fetch(); assertThat(result) .extracting("username") .containsExactly("member1", "member2"); } join(member.team, team)이라 되어있는데 뒤에 있는 team은 QTeam.team인데 static import로 인해서 team으로 ..
-
Querydsl - 정렬과 페이징, 집합JPA/Querydsl 2023. 8. 12. 23:28
정렬 /** * 회원 정렬 순서 * 1. 회원 나이 내림차순(desc) * 2. 회원 이름 올림차순(asc) * 만약, 회원 이름이 없으면 마지막에 출력(nulls last) */ @Test public void sort() { em.persist(new Member(null, 100)); em.persist(new Member("member5", 100)); em.persist(new Member("member6", 100)); List result = queryFactory .selectFrom(member) .where(member.age.eq(100)) .orderBy(member.age.desc(), member.username.asc().nullsLast()) // nullsLast는 해당 데..
-
Querydsl - 검색(select)과 결과 조회JPA/Querydsl 2023. 8. 12. 23:06
검색(select) 조건 쿼리 @Test public void search() { Member findMember = queryFactory .selectFrom(member) .where(member.username.eq("member1") .and(member.age.eq(10))) // .where(member.username.eq("member1"),member.age.eq(10))로 and 묶기도 가능 .fetchOne(); assertThat(findMember.getUsername()).isEqualTo("member1"); } select를 할 때에는 위와 같이 querydsl을 사용하면 된다. selectFrom으로 member를 받아온 다음에 where절에 조건을 준다. 여러 조건을 주..
-
Querydls과 JPQL의 차이JPA/Querydsl 2023. 8. 12. 22:28
@BeforeEach public void before() { Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Member("member2", 20, teamA); Member member3 = new Member("member3", 30, teamB); Member member4 = new Member("member4", 40, teamB); em.persist(member1); em.persist(member2); em.persist(memb..
-
Querydls의 기본 설정JPA/Querydsl 2023. 8. 12. 21:11
start.spring.io에서 프로젝트를 만들면 기본으로 생성되는 gradle.build에 주석으로 처리된 부분들을 추가해줘야 한다. querydls은 spring-boot 처음 생성 시에 추가해주지 않기 때문에 수동으로 설정해줘야 한다. 스프링 부트 3.0 기준 설정 buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'java' id 'org.springframework.boot' version '3.1.2' //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" id 'io.spring.dependency-management' version '1.1.2' } group..
-
Web 확장 - 페이징과 정렬JPA/스프링 데이터 JPA 2023. 8. 12. 15:32
페이징과 정렬을 Web에서 편하게 사용할 수 있도록 스프링 데이터 JPA가 기능을 지원한다. @GetMapping("/members") public Page list(Pageable pageable) { Page page = memberRepository.findAll(pageable); return page; } @PostConstruct public void init() { for (int i = 0; i < 100; i++) { memberRepository.save(new Member("user" + i, i)); } } memberRepository의 findAll의 파라미터에 pageable을 넣어주면 페이징을 사용할 수 있다. url에 파라미터로 페이지와 사이즈를 넘겨주면 웹에서 페이징을 해..
-
Auditing - 엔티티의 생성 변경 기록JPA/스프링 데이터 JPA 2023. 8. 12. 14:57
엔티티를 생성과 변경을 할 때 변경을 한 사람, 시간 기록을 남겨두면 운영 과정에서 훨씬 도움이 될 것이다. 순수 JPA에서의 Auditing 1. JpaBaseEntity라는 날짜 속성을 알려주는 엔티티를 만든다. @Getter @MappedSuperclass // 진짜 상속은 아니고 선언된 속성들만 사용한다는 것 public class JpaBaseEntity { @Column(updatable = false) private LocalDateTime createdDate; private LocalDateTime updatedDate; @PrePersist public void prePersist() { LocalDateTime now = LocalDateTime.now(); createdDate = ..
-
스프링 데이터 JPA에서의 사용자 정의 리포지토리JPA/스프링 데이터 JPA 2023. 8. 12. 14:20
스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동으로 생성해주는데 스프링 데이터 JPA가 제공해주는 인터페이스를 직접 구현하려면 구현해야할 것들이 너무 많다. 따라서 별도로 인터페이스를 만들어서 기능을 구현한 다음 그 인터페이스를 repository에서 상속받는 방법이 있다. 1. MemberRepositoryCustom을 만들어서 메서드를 선언만 한다. public interface MemberRepositoryCustom { List findMemberCustom(); } 2. 선언한 인터페이스를 구현해서 JPQL을 작성한다. 이 때 이름은 repository 이름 + Impl로 맞춰야 한다. @RequiredArgsConstructor public class Member..