JPA 52

52. JPQL 벌크연산

벌크연산은 update문이나 delete 문을 말함. pk를 딱 한건 찍어서 update나 delete 하는 걸 제외한 모든 update문과 delete문 한번에 모든 데이터를 포괄적으로 update나 delete 하는 것 재고가 10개 미만인 모든 상품의 가격을 10% 인상한다던지 그런 거. 저걸 JPA에서 한다고 하면 재고 10개 미만인거 조회 가격 10% 증가 commit 시점에 DB에 반영 근데 이거를 쿼리 한방으로 제공 근데 이거 그냥 sql도 있는 거 아닌가..? 그냥 딱히 조건 안주고 update 하면 다 그렇게 바뀌잖아. int result1 = em.createQuery("update Member m set m.age = 20") .executeUpdate(); Hibernate: /* ..

JPA/JPA 기본 2023.11.03

51. Named 쿼리

네임드 쿼리. 미리 이름 정해놓고 쓰는 쿼리. 그러니까 미리 정의해 놓고 이름으로 호출해서 쓰는 함수 같은 거임 어디다 정의해 놓냐면, @Entity @NamedQuery( name = "Member.findByUsername", query = "select m from Member m where m.username = :username" ) public class Member { ... 이렇게 엔티티 클래스에다가. 사용할 때는 List result1 = em.createNamedQuery("Member.findByUsername", Member.class) .setParameter("username", "회원1") .getResultList(); 이렇게. 나가는 쿼리는 그냥 저 쿼리 나가는 거임. Hi..

JPA/JPA 기본 2023.11.03

50. 엔티티 직접 사용

JPQL에서 엔티티를 직접사용하면 SQL에서는 그 엔티티의 기본 키값을 사용. 엔티티 직접 사용한다는 게 select count(m) from Member m 저렇게 m을 직접 사용한다는 거. 근데 저런 식으로 하면, select count(m.id) as cnt from Member m 저렇게 id로 나간다. 즉, function등에 엔티티를 직접 사용하면 id를 사용한다. select count(m.id) from Member m 이것도 같은 sql이 나감 파라미터 넘길때도 마찬가지 Member member = new Member(); member.setUsername("memberA"); em.persist(member); List result1 = em.createQuery("select m fr..

JPA/JPA 기본 2023.11.03

49. 다형성 쿼리

중요하지 않다고 한다. 객체에서는 다형성 되게 중요한 개념인데 JPQL은 특정 대상만 조회할 수 있는 기능이 있다. ? 그럼 그냥 DTYPE으로 하면 되는 거 아닌가? 맞다. 쿼리가 그렇게 나간다. 보통 객체에는 DTYPE이 없었던 걸로 기억하는데.. select i from Item i where type(i) in(Book, Movie) select 별칭 from 부모엔티티 별칭 where type(별칭) in(조회할자식엔티티1, 조회할자식엔티티2); 하면 select i from i where i.DTYPE in ('B', 'M'); 이렇게 나간다. TREAT 기능 (직역 : ~ 대하다) 자바의 타입캐스팅과 유사 상속구조에서 부모타입을 특정 자식타입으로 다룰 때 사용. from, where, sel..

JPA/JPA 기본 2023.11.03

48-2. 패치 조인의 한계

중요한 내용이라 이해가 부족한 거 같아서 다시 하고 넘어감. 패치 조인 대상에는 별칭을 줄 수 없다. fetch join이라는 것은 기본적으로 나와 연관된 것들을 모두 끌고 오는 것이다. 패치조인은 별칭을 주지 않는 것이 관례이다. 애초에 객체 그래프 사상 자체가, team에서 members 조회하면 그 team의 모든 members가 모두 나온다는 것을 가정하고 설계를 하였다. 그래서 fetch join 하는데 where해서 조건 줘서 걸러내서 가져오면 JPA는 객체 그래프 사상을 team의 members는 모두 나온다는 것을 가정하고 설계 하였기 때문에 뭐 cascade나 orphanRemoval 등 여러 옵션이 붙어있으면 작동이 이상하게 될 수도 있다. 그리고 만약 팀A를 조회하는데 하나는 팀A의 ..

JPA/JPA 기본 2023.11.02

48. 페치 조인 한계

패치 조인 대상에는 별칭을 줄 수 없음.ㄹ 하이버네이트는 가능하긴 하나, 사용하지 말라고 함. 별칭이라면 그러니까 예를 들어 join fetch t.members m where m.name = '홍길동' 이런 거 못 쓴다는 거임. fetch join 컨셉은 기본적으로 나랑 연관된 데이터를 다 끌고 오는 거임. Team의 members가 5명이 나와야 하는데, m.where해서 3명만 나오면.. 그럼 2명 누락될 수 있고.. 그래서 뭐 별칭써서 뭐.. 이런 거는 안 맞음. 쓰지 마셈. 이상하게 동작할 수 있음. 위험함. 둘 이상의 컬렉션은 패치 조인 할 수 없다. 일대다도 뻥튀기가 되는데, 일대 다 다 이니.. 패치조인 할 때 컬렉션은 하나만 지정할 수 있다. 패치조인은 페이징을 사용할 수 없다. 실행은 ..

JPA/JPA 기본 2023.11.01

47. 페치 조인 기본

fetch join 매우 중요 실무에서 엄청 많이 씀 SQL 조인 종류가 아니고, JPQL에서 성능 최적화를 위해 제공하는 기능. 연관된 엔티티나 컬렉션을 SQL로 한번에 한방 쿼리로 조회하는 기능. join fetch 조인할대상 select m from Member m join fetch m.team t 이렇게 쓴다. 그냥 join 뒤에 fetch 추가 시킨거다. 이렇게 하면 쿼리가 어떻게 나가냐면, Hibernate: /* select m from Member m join fetch m.team t */ select m1_0.id, m1_0.age, t1_0.id, t1_0.name, m1_0.type, m1_0.username from Member m1_0 join Team t1_0 on t1_0...

JPA/JPA 기본 2023.11.01

46. 경로 표현식

점 찍어서 객체 그래프 탐색하는 거. 그냥 우리가 계속 해왔던 m.username m.team 이런 거 근데 또 종류가 있음. select m.username//상태 필드 from Member m join m.team t//단일값 연관필드 join m.orders o//컬렉션 값 연관필드 where t.name 저 필드 종류에 따라 동작방식이 다름. 상태필드 : 단순히 값을 저장하기 위한 필드. 연관 필드 : 연관관계를 위한 필드 - 단일값 연관필드 : @ManyToOne, @OneToOne 대상이 엔티티. - 컬렉션 값 연관필드 : @OneToMany, @ManyToMany 대상이 컬렉션일 때 동작 상태필드 : 경로 탐색의 끝. 탐색X select m.username From Member m m.use..

JPA/JPA 기본 2023.11.01

45. JPQL 함수

concat : 합쳐라 substring : 잘라내라 trim : 맨 끝 공백 제거 lower, upper : 다 소문자, 혹은 다 대문자. length : 문자열 길이 locate : 문자나 문자열의 위치 abs, sqrt, mod : abs(절대값), sqrt(제곱근), mod(나머지) size, index(이것들은 JPA용임) : 위의 것 들은 JPA 표준이라 DB 관계없이 쓰면 됨. 그리고, 사용자 정의 함수 concat List result1 = em.createQuery("select concat('a','b') from Member m", String.class) .getResultList(); for (String s : result1) { System.out.println("s = " +..

JPA/JPA 기본 2023.10.31

44. 조건식. case 등등

자바의 switch case 문과 비슷한데, when이 case고 else가 default 마지막은 end로 조건식 끝이라는 걸 표현해 줘야 함. em.createQuery("select " + "case " + "when m.age = 60 then '경로요금'" + "else '일반요금'" + "end " + "from Member m", Member.class) .getResultList(); 이런 식. CASE ~ END까지 조건식. if ~ else랑 비슷하다. 이게 기본 case 식 이고, 단순 case 식 em.createQuery("select " + "case t.name " + "when '팀A' then '인센티브110%'" + "when '팀B' then '인센티브120%'" + "..

JPA/JPA 기본 2023.10.31