참고로 이 기능은 순수 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..
System.out.println("memberRepository = " + memberRepository.getClass()); log memberRepository = class jdk.proxy2.$Proxy123 jpaRepository를 extends한 repository를 로그에 찍어봤다. 정체는 프록시였는데, 스프링jpa가 인터페이스를 보고 구현체를 꼿아버린거다. 구현체를 스프링 JPA가 만들어주기 때문에 인터페이스 만으로 메소드를 다 사용이 가능한 것이다. 제네릭 타입 - T : 엔티티 - ID : 엔티티의 식별자 타입 - S : 엔티티와 그 자식 타입 주요 메서드 - save(S) : 새로운 엔티티는 저장하고 이미 있는 엔티티는 병합한다. - delete(T) : 엔티티 하나를 삭제한다...
@Entity @Getter @Setter public class Member { @Id @GeneratedValue private Long id; private String username; public Member(String username) { this.username = username; } protected Member() { } } jpa표준 스펙에 엔티티는 기본생성자가 있어야한다. 생성자는 private가 아닌 protected 정도로 열어둬야 한다고 한다. 왜냐면 JPA 프록시 기술을 쓰는데 JPA가 객체를 프록시로 강제로 객체를 만들기 때문에 열어둬야한다고 스펙에 되어있다.
- Total
- Today
- Yesterday
- BindingResult
- rejectValue
- 향해플러스
- React
- 항해플러스
- 향해99
- 예외처리
- 스프링공부
- 리터럴
- 백엔드 개발자 역량
- jpa api
- filter
- JPA
- reject
- 백엔드 개발자 공부
- Intercepter
- 컨트
- 항해99
- SpringBoot
- Java
- thymleaf
- hypertexttransferprotocol
- 향해플러스백엔드
- react실행
- exception
- 로그인
- ArgumentResolver
- HTTP
- 스프링부트
- 인터셉터
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |