일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Proxy
- Thymeleaf
- 백준
- 그리디
- kotlin
- Android
- http
- 스프링 핵심 원리
- db
- 알고리즘
- jpa
- spring
- SpringBoot
- JDBC
- 스프링
- pointcut
- AOP
- 김영한
- Servlet
- Spring Boot
- Exception
- java
- 인프런
- transaction
- JPQL
- 스프링 핵심 기능
- Greedy
- QueryDSL
- 자바
- springdatajpa
- Today
- Total
개발자되기 프로젝트
Repository에서 제공하는 기능 예시 본문
1. findAll(Sort)
데이터를 불러올 때 sorting하여 list로 저장이 가능. .이름 오름차순으로 해보자!
@Test
void crud(){//create, read, update, delete
//user객체 생성하고 저장하겠다다
//userRepository.save(new User());
//userRepository.findAll().forEach(System.out::println);
//System.out.println(">>>>"+ userRepository.findAll());
List<User> userList = userRepository.findAll(Sort.by(Sort.Direction.ASC,"name"));
userList.forEach(System.out::println);
}
아래처럼 로그도 확인할 수 있다. 이전엔 없던 order by가 추가됨.
from
user user0_
order by
user0_.name asc
User(name=hyun, email=hyun@naver.com, createdAt=2021-05-23T13:51:52.773553, updatedAt=2021-05-23T13:51:52.773553, id=1)
User(name=hyun, email=hyun@google.com, createdAt=2021-05-23T13:51:52.782557, updatedAt=2021-05-23T13:51:52.782557, id=5)
User(name=kim, email=kim@google.com, createdAt=2021-05-23T13:51:52.781619, updatedAt=2021-05-23T13:51:52.781619, id=4)
User(name=lee, email=lee@naver.com, createdAt=2021-05-23T13:51:52.781619, updatedAt=2021-05-23T13:51:52.781619, id=3)
User(name=park, email=park@google.com, createdAt=2021-05-23T13:51:52.781619, updatedAt=2021-05-23T13:51:52.781619, id=2)
아래처럼 로그도 확인할 수 있다. 이전엔 없던 order by가 추가됨.
2.findAllById
다음과 같이 작성하면 id별로 찾을 수 있다.
1L, 3L, 5L의 의미는 long type을 의미한다!
@Test
void crud(){//create, read, update, delete
//L은 long type의미
List<User> userList = userRepository.findAllById(Lists.newArrayList(1L, 3L, 5L));
userList.forEach(System.out::println);
}
실행결과! id가 1, 3, 5 인 데이터만 조회되었당.
User(name=hyun, email=hyun@naver.com, createdAt=2021-05-23T14:18:21.726153, updatedAt=2021-05-23T14:18:21.726153, id=1)
User(name=lee, email=lee@naver.com, createdAt=2021-05-23T14:18:21.745618, updatedAt=2021-05-23T14:18:21.745618, id=3)
User(name=hyun, email=hyun@google.com, createdAt=2021-05-23T14:18:21.745618, updatedAt=2021-05-23T14:18:21.745618, id=5)
3. Save
User 객체를 2개 만들어서 save해보자!
@Test
void crud(){//create, read, update, delete
User user1 = new User("jack", "jack@google.com");
User user2 = new User("steve", "steve@naver.com");
userRepository.saveAll(Lists.newArrayList(user1, user2));
List<User> userList = userRepository.findAll();
userList.forEach(System.out::println);
}
아래와 같이 저장된 것을 확인할 수 있다.
Hibernate:
call next value for hibernate_sequence
Hibernate:
call next value for hibernate_sequence
Hibernate:
insert
into
user
(created_at, email, name, updated_at, id)
values
(?, ?, ?, ?, ?)
Hibernate:
insert
into
user
(created_at, email, name, updated_at, id)
values
(?, ?, ?, ?, ?)
Hibernate:
select
user0_.id as id1_0_,
user0_.created_at as created_2_0_,
user0_.email as email3_0_,
user0_.name as name4_0_,
user0_.updated_at as updated_5_0_
from
user user0_
User(name=hyun, email=hyun@naver.com, createdAt=2021-05-23T14:35:31.477608, updatedAt=2021-05-23T14:35:31.477608, id=1)
User(name=park, email=park@google.com, createdAt=2021-05-23T14:35:31.526819, updatedAt=2021-05-23T14:35:31.526819, id=2)
User(name=lee, email=lee@naver.com, createdAt=2021-05-23T14:35:31.527873, updatedAt=2021-05-23T14:35:31.527873, id=3)
User(name=kim, email=kim@google.com, createdAt=2021-05-23T14:35:31.527873, updatedAt=2021-05-23T14:35:31.527873, id=4)
User(name=hyun, email=hyun@google.com, createdAt=2021-05-23T14:35:31.527873, updatedAt=2021-05-23T14:35:31.527873, id=5)
User(name=jack, email=jack@google.com, createdAt=null, updatedAt=null, id=6)
User(name=steve, email=steve@naver.com, createdAt=null, updatedAt=null, id=7)
4. getOne()
primary key를 가지고 하나의 entity를 가져옴
@Test
void crud(){//create, read, update, delete
User user = userRepository.getOne(1L);
System.out.println(user);
}
에러가 발생했다. Session이 없어서 proxy를 initialize할 수 없다!
could not initialize proxy [com.jpa.bookmanager.domain.User#1] - no Session
* session : JPA persistance context가 유지되는 하나의 session을 의미.
즉, transaction 시작~ 끝까지를 의미.
* 영속성 컨텍스트 : Entity를 영구 저장하는 환경, application 과 DB 사이에서 객체를 보관하는 가상 DB
* EntityManager : PersistenceContext를이용해 entity의 영속성을 관리
* flush() : JPA context에 있는 DB값을 DB에 반영
println.전에 session이 종료되어 발생한 문제로 @Transactional 을 method에 붙여준다.
@Test
@Transactional
void crud(){//create, read, update, delete
User user = userRepository.getOne(1L);
System.out.println(user);
}
getOne()은 기본적으로 Entity에 대해 lazy한 로딩을 지원함.
5. findById()
기본적으로 findById()의 리턴 타입은 Optional이다.
*Optional : wrapper 클래스로 null값을 한 번 감쌀 수 있어서 Null Point Exception을 방지할 수 있다.
Optional : A container object which may or may not contain a non-null value. If a value is present, isPresent() returns true. If no value is present, the object is considered empty and isPresent() returns false.
@Test
@Transactional
void crud(){//create, read, update, delete
Optional<User> user = userRepository.findById(1L);
System.out.println(user);
}
아래처럼 수정해서 사용이 가능하다. 값이 없는 경우 null을 리턴
@Test
@Transactional
void crud(){//create, read, update, delete
User user = userRepository.findById(1L).orElse(null);
System.out.println(user);
}
'JPA' 카테고리의 다른 글
Page , Query By Example(QBE) (0) | 2021.05.23 |
---|---|
Repository 제공 기능 2 (0) | 2021.05.23 |
data.sql작성 및 log조회 방법 (0) | 2021.05.23 |
JPA 설정 및 예시 (0) | 2021.05.23 |
H2 In-Memory DB (0) | 2021.05.22 |