간혹 개발 중에 JpaRepository가 아닌 사용자가 직접 구현한 쿼리들.. 순수 JPA 또는 mybatis, 데이터베이스 직접 커넥션 등을 사용하고 싶을 때가 있다. 하나의 레퍼지토리로 엮어 사용하면 되는데 1. 인터페이스를 먼저 만들고 2. 상속받아 구현체를 만든 뒤에 3. JPA레퍼지토리를 상속받은 레퍼지토리에 상속시키면 된다. 1. package study.datajpa.repository; import study.datajpa.entity.Member; import java.util.List; public interface MemberRepositoryCustom { List findMemberCustom(); } 2. package study.datajpa.repository; import..
JPA 쿼리 힌트 (SQL 힌트가 아니라 JPA 구현체에게 제공하는 힌트) @Test public void queryHint(){ Member member = new Member("member1", 10); memberRepository.save(member); em.flush(); em.clear(); Member findMember = memberRepository.findById(member.getId()).get(); findMember.setUsername("member2"); em.flush(); } 만약 이런 식의 코드가 있다면 현재 변경감지가 일어나서 setUsername이 변경되었을 것이다. 만약에 업데이트(수정)을 하지 않는다고 해도 조회시에 변경감지를 위해 어딘가에 원본을 놔두게 된다..
참고로 이 기능은 순수 JPA 2.2 부터 들어간 기능이라 한다. @Test public void findMemberLazy(){ Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Member("member2", 10, teamB); memberRepository.save(member1); memberRepository.save(member2); em.flush(); em.clear(); List members = ..
이런 경우가 있다. 모든 직원의 연봉을 10% 인상해! 라는 경우이다. 이런 것을 벌크성 수정 쿼리라 한다. 이런 경우에는 db를 호출해서 로직을 짜는 것 보다, 업데이트 쿼리를 날리는 것이 효과 적인데 이걸 벌크성 수정 쿼리라 한다. 순수 JPA 업데이트 public int bulkAgePlus(int age){ int resultCount = em.createQuery("update Member m set m.age = m.age + 1 where m.age >= :age") .setParameter("age", age).executeUpdate(); return resultCount; } DataJPA 업데이트 @Modifying @Query("update Member m set m.age = m...
JPA Repository를 상속하면 다음과 같이 자유롭게 find...By 안에 어떤 이름이든 지을 수 있으며 BY 이후가 중요하다. List findListByUsername(String username); //컬렉션 Member findMemberByUsername(String username); //단건 Optional findOptionalByUsername(String username); //단건 Optional 주의점 - list로 받으면 절대 null이 아니다 size가 0으로 나온다. 그러므로 Null 체크 조심해야 한다. - 단건 조회에서는 Member일 경우 null을 반환한다. - 그러므로 자바8 이상에서 부터는 그냥 Optional로 받아서 처리해야한다. 순수 JPA 페이징 pub..
package study.datajpa.dto; import lombok.Data; @Data public class MemberDto { private Long id; private String username; private String teamName; public MemberDto(Long id, String username, String teamName) { this.id = id; this.username = username; this.teamName = teamName; } } @Query("select new study.datajpa.dto.MemberDto(m.id, m.username, t.name) from Member m join m.team t") List findMemberDto..
package study.datajpa.entity; import jakarta.persistence.*; import lombok.*; @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) // 기본생성자 만들기, 기본생성자는 JPA 스펙으로 private는 안된다. @ToString(of = {"id", "username", "age"}) //toString을 만들 때에는 가급적이면 연관관계객체는 넣지 않는것이 좋다(서로 부르면서 무한루프 된다.) @NamedQuery( name="Member.findByUsername", query="select m from Member m where m.username =: usern..
package study.datajpa.repository; import org.springframework.data.jpa.repository.JpaRepository; import study.datajpa.entity.Member; import java.util.List; public interface MemberRepository extends JpaRepository { List findByUsernameAndAgeGreaterThan(String username, int age); } @Test public void findByUsernameAndAgeGreaterThen(){ Member m1 = new Member("AAA", 10); Member m2 = new Member("AAA", 2..
- Total
- Today
- Yesterday
- 향해플러스백엔드
- exception
- ArgumentResolver
- thymleaf
- 향해플러스
- SpringBoot
- 리터럴
- reject
- 스프링공부
- 향해99
- rejectValue
- Java
- HTTP
- 항해99
- BindingResult
- 백엔드 개발자 공부
- React
- Intercepter
- hypertexttransferprotocol
- 인터셉터
- 로그인
- JPA
- filter
- jpa api
- 항해플러스
- react실행
- 백엔드 개발자 역량
- 예외처리
- 컨트
- 스프링부트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |