Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

Repository에서 제공하는 기능 예시 본문

JPA

Repository에서 제공하는 기능 예시

Seung__ 2021. 5. 23. 16:28

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
Comments