728x90

jpa 76

(Spring Data JPA)리스트에서 첫번째 값만 가져오기

최근 개발하면서 가장 상위에 있는 한개의 로우의 id 값을 id순으로 역순으로 정렬한뒤 가져오는 쿼리를 짜서 작업을 하려고 다음과 같이 쿼리문을 작성해서 JPQL을 사용하려고 했는데, 오류가 발생했다. -- mariaDB 기준 select id from table order by id desc limit 1; 찾아보니 JPQL은 limit 명령어를 지원하지 않는다고 해서, 구글을 좀 뒤져보니 쉽게 해결방법을 찾을 수 있었다. Spring JPA에서도 결과를 제한하는 기능을 제공하고 있었고, 나의 경우는 다음 문서를 참고했다. (Spring JPA Doc) Spring Data JPA - Reference Documentation Example 108. Using @Transactional at query..

JPA 2022.08.24

INNER JOIN, LEFT JOIN, RIGHT JOIN의 차이

예제 테이블 mysql> select * from demo_people; name phone pid Mr brown 01225 708225 1 Miss Smith 01225 899360 2 Mr Pullen 01380 724040 3 mysql> select * from demo_property; pid spid selling 1 1 Old House Fram 3 2 The Willows 3 3 Tali Trees 3 4 the Melksham Florist 4 5 Dun Roamin 1. 기본 JOIN (= INNER JOIN) - 기본적으로 JOIN은 교집합이다. select name, phone, selling from demo_people join demo_property on demo_peopl..

Database 2022.07.17

QueryDSL 페이징 방법

QueryDSL 에서의 페이징 -> offset과 limit를 통해서 페이징을 할 수 있다. LIMIT 숫자 : 출력할 행의 수 OFFSET 숫자 : 몇번째 row부터 출력할 지. (1번째 row면 0) 조회 건수 제한 @Test public void paging1() { List result = queryFactory .selectFrom(member) .orderBy(member.username.desc()) .offset(1) //offset은 0부터 시작(zero index), 현재 코드에서는 1번부터 데이터를 가져오도록 하므로 맨 처음 데이터는 생략됨 .limit(2) //최대 2건 조회 .fetch(); assertThat(result.size()).isEqualTo(2); } 전체 데이터 수..

QueryDSL 2022.07.16

페이징 한계돌파 시, ToMany 관계를 Entity -> DTO로 표현하는 방법

@GetMapping("/api/v3.1/orders") public List ordersV3.1() { // ORDER 2개 // N + 1 -> 1 + 회원 N + 배송 N List orders = orderRepository.findAllByString(new OrderSearch()); List result = orders.stream() .map(o -> new OrderDto(o)) .collect(Collectors.toList()); return result; } @Data static class OrderDto { private Long orderId; private String name; private LocalDateTime orderDate; private OrderStatus or..

JPA 2022.07.14

동적 쿼리 - BooleanBuilder 사용

동적 쿼리를 해결하는 두가지 방식 BooleanBuilder Where 다중 파라미터 사용 @Test public void 동적쿼리_BooleanBuilder() throws Exception { String usernameParam = "member1"; Integer ageParam = 10; List result = searchMember1(usernameParam, ageParam); Assertions.assertThat(result.size()).isEqualTo(1); } private List searchMember1(String usernameCond, Integer ageCond) { BooleanBuilder builder = new BooleanBuilder(); if (userna..

QueryDSL 2022.06.25

JPA 낙관적 락(부제 - OPTIMISTIC)

OPTIMISTIC @Version만 적용했을 때는 엔티티를 수정해야 버전을 체크하지만 이 옵션을 추가하면 엔티티를 조회만 해도 버전을 체크한다. 한 번 조회한 엔티티는 트랜잭션을 종료할 때까지 다른 트랜잭션에서 변경되지 않음을 보장한다. 용도 : 조회 시점부터 트랜잭션이 끝날 때까지 조회한 엔티티가 변경되지 않음을 보장한다. 동작 : 트랜잭션을 커밋할 때 버전 정보를 조회해서 현재 엔티티의 버전과 같은지 검증한다(SELECT 쿼리 사용). 만약 같지 않으면 예외가 발생한다. 이점 : OPTIMISTIC 옵션은 DIRTY READ와 NON-REPEATABLE READ를 방지한다. DIRTY READ : 커밋되지 않은 데이터를 읽을 수 있다. 예를 등러 트랜잭션1이 데이터를 수정하고 있는데 커밋하지 않아도..

JPA 2022.06.22

@Converter (부제 - 데이터 변환)

컨버터(converter)를 사용하면 엔티티의 데이터를 변환해서 데이터베이스에 저장할 수 있다. 자바의 boolean 타입은 방언에 따라 다르지만 데이터베이스에 저장될 때 0 또는 1인 숫자로 저장된다. 그런데 데이터베이스에 숫자 대신 문자 Y 또는 N으로 저장하고 싶다면 컨버터를 사용하면 된다. CREATE TABLE MEMBER ( ID VARCHAR(255) NOT NULL, USERNAME VARCHAR(255), VIP VARCHAR(1) NOT NULL, -- 변환할 컬럼 PRIMARY KEY(ID) ) 매핑할 테이블을 보면 문자 Y, N을 입력하려고 VIP 컬럼을 VARCHAR(1)로 지정했다. @Entity public class Member { @Id private String id; p..

JPA 2022.06.21

페이징과 정렬

스프링 데이터 JPA는 쿼리 메소드에 페이징과 정렬 기능을 사용할 수 있도록 2가지 특별한 파라미터를 제공한다. org.springframework.data.domain.Sort: 정렬 기능 org.springframework.data.domain.Pageable: 페이징 기능(내부에 Sort 포함) 파라미터에 Pageable을 사용하면 반환 타입으로 List나 org.springframework.data.domain.Page를 사용할 수 있다. Page를 사용하면 스프링 데이터 JPA는 페이징 기능을 제공하기 위해 검색된 전체 데이터 건수를 조회하는 count 쿼리를 추가로 호출한다. //count 쿼리 사용 Page findByName(String name, Pageable pageable); //c..

SpringDataJPA 2022.06.21
728x90