JPA/JPA 기본 52

43. JPA 타입 표현과 기타식

em.createQuery("select i from Item i where type(i) = Book", Item.class) .getResultList(); 문자 : '헬로' 숫자 : 10L(Long), 10D, 10F, 10 등 앞에 DF는 더블, 플로트 Boolean : true, false enum : 패키지명 다 포함해서 넣어야 함. jpashop(패키지명).MemberType(enum클래스).Admin(enum 값) jpashop.MemberType.Admin 엔티티 : type(별칭) -> select i from Item i where type(i) = Book 이렇게 하면 DTYPE 보고 찾아 줌. 상속관계. Book 이렇게 엔티티 그자체? 엔티티 다 JPQL에서 인지하니까.. 그냥 엔..

JPA/JPA 기본 2023.10.31

42. 서브쿼리

sql에서 처럼 쿼리 안의 쿼리 라는 느낌 List result = em.createQuery("select m from Member m where exists(select t from m.team t where t.name = 'teamA')", Member.class) .getResultList(); member를 가져오는데, exists, 즉 존재하는 경우만. 멤버의 팀의 이름이 teamA인 경우에만 가져옴. (where) select o from Order o where o.orderAmount > all(select p.stockAmount from Product p) 주문을 가져오는데, 주문량이 상품(Product)의 재고보다 클 경우만 select m from Member m where m...

JPA/JPA 기본 2023.10.31

41. 조인

sql 조인이랑 거의 비슷한데, JPQL은 엔티티 중심으로 동작한다. 내부(inner) 조인 List result = em.createQuery("select m from Member m inner join m.team t", Member.class) .getResultList(); for (Member m : result) { System.out.println("result = " + m.getUsername()); System.out.println("result = " + m.getTeam().getName()); } inner는 생략이 가능하다. 내부 조인은 만약 team이 없으면 아예 member까지 나오지 않는다. Hibernate: /* select m from Member m inner jo..

JPA/JPA 기본 2023.10.31

40. 페이징

페이징이란 한 화면에서 보여주는 데이터의 범위를 결정하는 일련의 방법이라고 하는데, 뭐 mysql에서 limit 하고 하던 걸 페이징 이라고 하는 것 같다. JPA는 페이징을 추상화 해버림 JPA에서는 페이징 할 때 2가지만 쓰면 됨. setFirstResult(인덱스) : 조회 시작 위치 setMaxResults(인덱스) : 조회 끝 위치. List result = em.createQuery("select m from Member m order by m.age desc", Member.class) .setFirstResult(0) .setMaxResults(10) .getResultList(); for (Member m : result) { System.out.println("result = " + m..

JPA/JPA 기본 2023.10.31

39. 프로젝션(select)

select 절에 조회할 대상을 지정하는 것. 그 뭐 sql에서 select 할 때 * 해서 모두 가져오기도 하고, select name, age 해서 뭐 이렇게 2개 가져오기도 하고 그거 말하는 거임. 일단 종류는 엔티티 임베디드 타입 스칼라타입(숫자, 문자 등 기본 데이터) 엔티티는 엔티티 자체, *랑 비슷할 거 같고, 임베디드 타입은 우리가 임베디드 정의한 거 사실 상 테이블에서는 그냥 열 몇개를 객체상에서는 모아놓은 거 이므로, 그냥 테이블에서 그 열들 조회해오는데 자바에서는 그게 그 임베디드 타입 객체로 얻어올 수 있단 이야기같고, 스칼라타입 기본 타입은 그냥 가져오면 됨. name, age 등 숫자나 문자 기본 타입 환경에서 보자면 m -> 엔티티 m,team -> 엔티티 m.address -..

JPA/JPA 기본 2023.10.30

38. JPQL 기본 문법

Java Persistence Query Language JPQL은 객체지향 쿼리 언어 테이블 대상이 아니라 자바 내의 엔티티 객체 대상. JPQL은 SQL을 추상화 한 것이라 특정DB에 의존하지 않음. JPQL은 결국 SQL로 변환됨. 예제 JPQL 해볼 예제임. 코드 @Entity public class Member { @Id @GeneratedValue private Long id; private String username; private int age; @ManyToOne @JoinColumn(name = "team_id") private Team team; } @Entity public class Team { @Id @GeneratedValue private Long id; private St..

JPA/JPA 기본 2023.10.30

37. JPQL

JPA는 다양한 방식으로 쿼리방법을 지원 JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접사용, MyBatis, SpringJdbcTemplate와 함께 JPA Criteria 자바코드로 짜서 JPQL로 빌드해주는 제너레이터 네이티브 SQL은 JPQL써도 가끔 정말 DB종속적인 쿼리를 짜야할 때가 있음. 표준 SQL을 벗어나는. 거의 JPQL로 해결이 되긴 하는데, 정말 가끔 안될 때가 있다. 그 때 네이티브SQL이나 MyBatis나 스프링JDBCTemplate 같은 걸 쓰면 된다. JPQL은 엔티티중심적 언어. 테이블은 매핑만 하는 거고, JPQL은 엔티티 대상으로 작성하는 언어임. 결국 문제는 검색쿼리인데, JPQL은 검색도 테이블이 아닌 엔티티 객체를 대상으로 검..

JPA/JPA 기본 2023.10.30

36. 값타입 실전

할만한 게 이제 address. 저거 한곳에 모아서 관리하기 괜찮아 보임. 근데 이미 하지 않았나..? 여튼 다시 해봄 @Embeddable public class Address { private String city; private String street; private String zipcode; } getter, setter는 getter는 public, setter는 private 그러므로 생성자는 기본생성자에, 필드들 다 받는거. 또 그다음 equals() 오버라이드. 인텔리제이가 자동 생성 해 주는거. 근데 이거 할 때, 저거 getters 사용하라고 체크해주는 게 좋음. 저거 체크 안하면 this. 해서 이렇게 접근하는데, 그러면 프록시일경우 제대로 접근 못함. 프록시는 원본을 째로 가지고..

JPA/JPA 기본 2023.10.30

35. 값타입 컬렉션

값타입 컬렉션은 값타입을 컬렉션에 담아서 쓰는거다. 기본값타입이나 임베디드를 컬렉션에 담아서 쓰는 걸 말하는 건가.. 지금까지 엔티티는 컬렉션에 넣어서 한 적은 있는데.. 일단. RDB 테이블에서는 컬렉션을 할 수 있는 구조는 없다. (json 하면서 그런 것들에 대한 걸 지원하는 DB도 있긴 하지만) 그래서 저렇게 테이블을 따로 나눈 듯 하다. 그래서 그냥 개념적으로 보면 일대다랑 같다. 보면은 다 PK이다. 뭐 저렇게 식별자 같은 개념을 넣어서 걔를 PK로 쓰면 그거는 값타입이 아니라 엔티티라고.. 그냥 이럴경우는 엔티티로 설계하면 되는 거 아닌가..? 여튼 그래서 값타입은 이렇게 이 값들을 테이블에 값들만 저장되고 이걸 묶어서 PK로 구성을 하면 된다고 하는데... 기본자료구조 하위에 있는 인터페이..

JPA/JPA 기본 2023.10.29

34. 값타입 비교

값타입은 아무래도 인스턴스가 달라도 그 안에 값이 같으면 같은 것으로 봐야 함. 예를 들면 테이블에서 같은 주소를 가지고 있으면 그건 같은 곳에 사는 거니까.. 근데 임베디드 타입, 얘네들은 클래스기 때문에 == 했을 때 인스턴스의 주소를 비교하기 때문에.. 내부의 값이 같다고 해도 다른 거라고 나옴. 그래서, 값타입 비교 시 동일성 비교 : 인스턴스의 참조를 비교, == 사용 과 동등성 비교 : 인스턴스의 값을 비교, equals() 등 이 둘을 구분해서 사용해야 함. 그래서, 값타입은 equals() 메소드를 재정의 해야 함. 거의 모든 필드를 지정해서 재정의 해야함. 참고로, equals() 자체의 기본이 ==비교라 재정의 해야 함. 보통 equals() 재정의 할 때는 자동으로 만들어 주는 거 쓰..

JPA/JPA 기본 2023.10.29