JPA의 사용방법
·
JPA 게시판/JPA
일단 엔티티를 작성한다. package org.cvcvcx.board.entity; import lombok.*; import javax.persistence.*; @Entity @Builder @AllArgsConstructor @NoArgsConstructor @Getter @ToString(exclude = "writer") public class Board extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long bno; private String title; private String content; @ManyToOne(fetch = FetchType.LAZY) private Member wri..
JPQL에서 Object[] 형식으로 반환이 되는 이유
·
JPA 게시판/JPA
하나의 엔티티만을 처리할 때에는 반환되는 값이 타입으로 반환되었지만,여러개의 엔티티가 같이 들어있는 것을 처리할 때에는 여러개의 타입이 같이 나오기 때문에Object[] 와 같은 형태로 쿼리의 결과 값이 반환된다. 이 반환값을 잘 가공해서 DTO로 만들어서 보내면 화면상에 원하는 값이 반영된다. Uploaded by N2T
QueryDsl의 설정방법— 스프링 부트 2.7버전 이전 버전기준
·
JPA 게시판/JPA
implementation 'com.querydsl:querydsl-jpa:5.0.0' annotationProcessor( "javax.persistence:javax.persistence-api", "javax.annotation:javax.annotation-api", "com.querydsl:querydsl-apt:5.0.0:jpa") 위 코드를 build.gradle에 추가하고, 최상위 폴더 아래에 있는 build.generated.sources.annotationProcesser.java.main 폴더를 잘 확인해보면 엔티티를 기반으로 한 Q~~~~ 클래스들이 생성되어있을 것이다.하지만, 위치가 마음에 들지 않는 경우에는 지정할 수 있는 방법이 있다. plugins { id 'java' id ..
QueryDsl DTO로 조회하는방법
·
JPA 게시판/JPA
MemberDTOpackage study.querydsl.dto; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data @Builder @NoArgsConstructor public class MemberDTO { private String username; private int age; public MemberDTO(String username, int age) { this.username = username; this.age = age; } } JPQL에서 DTO로 조회하는 방법은 다음과 같다. @Test public void findDtoByJPQL(){ //아래와 같이 생성자를 사용하는 것과 같은 문법으로..
DTO QueryProjection
·
JPA 게시판/JPA
DTO의 생성자에 붙이는 어노테이션@QueryProjection 을 사용하면, DTO의 QType을 만들 수 있고, 그걸 사용해서 쿼리문을 생성할 수 있다. UserDTO@Data @NoArgsConstructor @Builder public class UserDTO { private String name; private int age; @QueryProjection public UserDTO(String name, int age) { this.name = name; this.age = age; } }이후, complieQuerydsl을 하면, DTO의 Q타입이 생성된다.@Test public void findDtoByQueryProjection() throws Exception{ //given List..
QueryDsl에서 동적쿼리를 해결하는법
·
JPA 게시판/JPA
BooleanBuilder를 사용해서 해결하는법과 Where문에서 다중 파라미터를 사용하는 방법 두가지가 존재 BooleanBuilder@Test public void 동적쿼리_booleanBuilder() throws Exception{ //given String usernameParam = "member1"; Integer ageParam = 10; //when List members = searchMember1(usernameParam, ageParam); //then members.forEach(member1 -> System.out.println("member1 = " + member1)); assertThat(members.size()).isEqualTo(1); } //동적 검색 조건을 영어로..
BaseEntity의 작성
·
JPA 게시판/JPA
수정되거나, 생성된 날짜를 기록하는 컬럼이 중복되는데, 엔티티마다 이것을 작성하는 것보다,BaseEntity를 작성해서, 중복되는 컬럼을 처리해보자 //BaseEntity.java @MappedSuperclass @EntityListeners(value = AuditingEntityListener.class) @Getter abstract class BaseEntity { @CreatedDate @Column(name = "regdate",updatable = false) private LocalDateTime regDate; @LastModifiedDate @Column(name = "moddate") private LocalDateTime modDate; }@MappedSuperclass와 @Enti..
@ManyToOne의 설정방법
·
JPA 게시판/JPA
@Entity @Getter @ToString(exclude = "memberId")//꼭, 다른 엔티티에 의존하는 컬럼을 tostring에서 제외시킬것 public class Order extends BaseEntity{ @Id @GeneratedValue @Column(name = "order_id") private Long orderId; //targetEntity로 어떤 엔티티에 의존할지 설정하고, fetch로 지연조회 설정할것 //지연조회를 설정하지 않으면, 멤버가 필요하지 않은 상황에서도 함께 조회하게 됨 //그래서 지연 조회를 설정하고 필요할 때만 즉시조회 설정하는게 성능상 이득임 @ManyToOne(targetEntity = Member.class,fetch = FetchType.LAZY)..