티스토리 뷰
* 페이징
SuperCarDAO.java
alt+enter > inject language > jpql 엔터 > 쌍따음표안에서 색깔 표시 가능
정렬을 해야 최신순으로 나옴.
SuperCarTest.java
(1, 10) > 1번부터 10개 뽑기(1페이지)
(10, 10) > 10번부터 10개 뽑기(2페이지)
* 수정(벌크연산)
하나만 수정할 때는 setter를 쓰면 되지만,
한번에 여러 개 수정할 때, ex) 자동차 금액 전체 10% 인상, 벌크 연산을 사용해야 한다.
벌크연산 : 영속성 컨텍스트를 무시하고 SQL 반영된다. 영속성 컨텍스트와의 불일치(디비만 반영된 상태)
무조건 영속성 컨텍스트를 비워주고 벌크연산을 해야 한다!!
SuperCarDAO.java
executeUpdate : insert, update, delete 쿼리일 때 사용
executeQuery : getResultList(), getSingleResult()
SuperCarTest.java
DAO에서는 메소드 하나하나가 트랜잭션이기 때문에 커밋 후 1차 캐시가 자동으로 클리어 된다.
-------디비와 영속성 컨텍스트의 불일치를 보여주기 위한 코드--------
디비만 반영되고, 영속성 컨텍스는 불일치 상태임..
수정하고 나서 다시 조회를 해야 한다.. 왜? 컨텍스트에 저장된 것은 수정 반영이 되기 전이니까,
flush를 안하고 clear를 한 이유, 아예 영속성 컨텍스트를 비워줘서 1차 캐시에 저장된 쿼리를 없애기.
다시 select를 하면 정상적으로 수정이 반영된 데이터를 가져올 수 있음.
>> 벌크 연산 이후, 다시 select해주는 설정이 있음, 그걸 사용해주면 편리함.
DAO 대신 이제 Repository를 사용한다.
public interface MemberRepository extends JpaRepository<entityName, entityIdType>{
}
JpaRepository : 인터페이스, 구현체는 따로 있음. 제네릭에 어떤 엔티티를 엮을 건지, id가 무슨 타입인지 넣어야 함.
인터페이스끼리 상속받음.
엔티티를 쓰는 이유? 1차 캐시에 등록해야 하니까,
원래 직접 엔티티 매니저 호출해서 persist해서 등록됐는데, 이제 직접 엔티티매니저를 안 쓰니까
엔티티랑 id타입을 써서 알려줘서 persist하게 해주기.
멤버레포지토리는 jpa레포지토리를 상속받았기 때문에 jpa레포지토리에 이미 구현체가 구현되어 있음.
멤버레포지토리 주입신청(autowired)을 하면 jpa레포지토리에 있는 내용들을 멤버레포지토리에서 사용할 수 있다.
기본적으로 쓸 수 있는 메소드가 많다. (자주 쓰는 crud...)
@Transactional
엔티티팩토리가 엔티티매니저를 만듦. 엔티티 매니저의 개수라고 보면 됨.
트랜젝셔널을 엔티티매니저당 하나라고 보면 됨.
클래스에다 트랜잭셔널을 걸었으면 그 안에 엔티티매니저를 공유하게 된다.
하나의 트랜잭션으로 묶을 때 사용하는 것임.
트랜잭셔널 하나당 엔티티 매니저 하나다.
flush나 clear를 직접 할거면 엔티티 매니저를 불러줘야 하기 때문에 트랜잭셔널을 잘 묶어놔야 한다.
Assertions.assertThat 검증
isPresent() 사용하기, null인지 아닌지 확인하기
기본적으로 쓸 수 있는 메소드에 내가 필요한 메소드가 없다?
레포지토리에서 쿼리메소드 사용하기
쿼리메소드: 메소드 이름에 따라 쿼리가 나감.
find~ : select문 나감.
By~ : where절이 나감.
스프링데이터jpa에서 지원한다. 인터페이스 추상메소든데, 만들어놓으면 구현체를 던져줌.
MemberRepository.java
between, startingwith, ... 필요한 것들 골라서 쓰면 된다.
MemberRepositoryTest.java
@Query - 쿼리메소드에 없는 쿼리를 내가 적을 수도 있다.
: key값 - 파라미터 바인딩, 이름 기반 / @Param("")으로 매핑
%를 앞,뒤,앞뒤 모두 사용 가능,, 굿,,
@Query는 executeQuery가 default임.
executeUpdate를 쓰려면 @Modifying을 붙여줘야 함.
컨텍스트와 디비와의 불일치를 없애주기 위해 (clearAutomatically = true)를 붙여줘야 함.
MemberRepositoryTest.java
*벌크 연산 유의하기*
SuperCarRepository.java
public Page<SuperCar> findAll(Pageable pageable);
SuperCarRepositoryTest.java
페이지 관련
* 최신글 10개 list로 받아오기
SuperCarRepository.java
public List<SuperCar> findTop10ByOrderBySuperCarIdDesc();
SuperCarRepositoryTest.java
@Test
public void findTop10OrderBySuperCarIdDescTest(){ //최근게시물 10개 가져옴
superCarRepository.findTop10ByOrderBySuperCarIdDesc().stream().map(SuperCar::toString).forEach(log::info);
}
'2022 > jpa' 카테고리의 다른 글
day03[상속] (0) | 2022.11.30 |
---|---|
day03[JPA new project] (0) | 2022.11.30 |
day02[순수jpa, entity] (0) | 2022.11.15 |
day02[JPQL] (0) | 2022.11.15 |
day02[create table] (0) | 2022.11.15 |