본문 바로가기
반응형

학습/DB46

다형성 쿼리 다형성 쿼리를 날리는 JPQL과 SQL을 비교한다. *목차 1. IN절 사용 2. TREAT 사용 1. IN절 사용 String query = "select i from Item i where type(i) IN (Book, Album)"; List items = em.createQuery(query, Item.class).getResultList(); //JPQL select i from Item i where type(i) in (Book, Album); //SQL select i from Item i where i.DTYPE in (Book, Album); Hibernate: /* select i from Item i where type(i) IN ( Book, Album ) */ select it.. 2021. 10. 7.
MERGE INTO(oracle) 오라클 DB를 사용하다보면, 특정 테이블을 수정해야 할 때가 있다. 테이블 수정하려는데, 해당 케이스가 없다면 추가해야되는 상황도 있다. 이처럼 특정 테이블에 UPDATE와 INSERT를 같이하는 경우 ORACLE에서 MERGE INTO를 사용하여 해결할 수 있다. * 테이블, 데이터 생성 CREATE TABLE BEFORE_SCORE ( STUDENT_ID VARCHAR2(100), SCORE NUMBER(5,2) CONSTRAINT PK_BEFORE_SCORE PRIMARY KEY (STUDENT_ID) ) 과거 점수 테이블 BEFORE_SCORE를 생성한다. (현재 점수 테이블 NOW_SCORE도 똑같은 칼럼과 기본키를 가진다.) INSERT INTO BEFORE_SCORE(STUDENT_ID, S.. 2021. 10. 7.
서브쿼리 서브쿼리란, SQL 쿼리 안에 있는 또다른 SQL 쿼리를 뜻한다. 또한 검색할 데이터를 추가로 제한하는 조건으로 main 쿼리에서 사용할 데이터를 반환할 때 사용한다. 서브쿼리는 SELECT, INSERT, UPDATE, DELETE문을 사용할 수 있다. 또한 대표적으로 SELECT의 경우, SELECT, WHERE, FROM 3군데에서 사용한다. *서브쿼리 특징 - 만약 main 쿼리에서 여러개의 칼럼이 필요하지 않다면, SELECT 에서는 1개의 칼럼값만 가질 수 있다. - main 쿼리에서 ORDER BY를 사용할 수 있더라도, 서브쿼리에서는 ORDER BY를 사용할 수 없다. - main 쿼리에서 GROUP BY를 사용하듯이, 서브쿼리에서 GROUP BY를 사용할 수 있다. - 1개 이상의 데이터.. 2021. 10. 6.
조인 *목차 1. 내부조인 2. 외부조인 3. 세타조인 4. JPA 조인 - ON 절 - 1.조인 대상 필터링 - 2.연관관계 없는 조인 내부조인 SELECT m FROM Member m [INNER] JOIN m.team t Member는 있고 Team이 없으면 포함안된다 List resultList = em.createQuery("select m from Member m INNER JOIN m.team") .getResultList(); Member result = resultList.get(0); System.out.println(result.getName()); System.out.println(result.getAge()); Hibernate: /* select m from Member m INNER.. 2021. 10. 6.
프로젝션(엔티티, 임베디드, 스칼라타입) SELECT 절에 조회할 대상을 지정한다. 일반 SQL 조회는 단순히 원하는 칼럼을 조회하지만, JPA는 엔티티, 임베디드, 스칼라타입등 다양한 리턴타입이 조회대상에 올 수 있다. *목차 1. 프로젝션 종류 2. 연관 컬렉션 조회와 한계 - 명시적 내부 조인 권장 3. 프로젝션 여러 값 조회 프로젝션 대상 : 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자 등 기본 데이터 타입) 1. 프로젝션 종류 //엔티티 프로젝션 SELECT m FROM Member m //엔티티 프로젝션(내부조인 발생) SELECT m.team FROM Member m //임베디드 타입 프로젝션 SELECT m.address FROM Member m //스칼라 타입 프로젝션 SELECT m.username, m.age FROM .. 2021. 10. 6.
경로 표현식 * 경로표현식이란? .(점)을 찍어 객체 그래프를 탐색하는 것 상태필드, 단일 값, 컬렉션 값 3가지의 경로 표현식이 있다. select m.username //상태필드 from Member m join m.team t //단일 값 연관필드 join m.orders o //컬렉션 값 연관필드 where t.name = '팀A'; 상태필드 연관 엔티티 연관 컬렉션 SELECT 문법 m.username m.team t.members 리턴타입 String Team Collection 추가 경로조회 불가능 가능 불가능 특징 단순한 값 엔티티 1개 엔티티 여러개 * 쿼리 비교 1. 상태 필드 경로 검색 //JPQL SELECT m.username, m.age FROM Member m //SQL SELECT m.u.. 2021. 10. 5.
JPA에서 Dirty Check 방지하기 JPA에서 업데이트 방식은 dirty check로, 모든 행에 대해서 하나씩 update 쿼리를 날려서 수정한다. 성능에 악영향을 줄 수 있다. 따라서 조회 전용이면 dirty check를 사전에 방지하는 것이 좋으며 @Transactional(readOnly = true)를 사용한다. @Transactional public void update() { List comments = commentRepository.findAll(); for (Comment comment : comments) { comment.setComment("별로에요"); commentRepository.save(comment); } } commentRepository.findAll()로 모든 comment를 조회하고 "별로에요"로 .. 2021. 10. 2.
영속성 컨텍스트로 발생하는 이슈 영속성 컨텍스트는 이슈는 JPA의 "동일성" 때문에 발생하는 문제이다. 왜냐하면 영속성 컨테스트에서 관리되는 객체들은 "==" true를 보장하기 때문이다. 따라서, 예상치 못한 문제가 발생할 수 있으니 영속성 컨텍스트를 주의해서 관리해야 한다. *주의* 1. 값을 조회해서 "수정"하는지, 새롭게 "생성"하는지 주의해서 확인한다. 2. @Transactional이 선언된 메서드는 모든 메서드가 "끝나는 시점"에 영속성 컨텍스트가 DB에 반영된다. 3. JPA에서 "조회"를 하면 DB에서 쿼리를 조회해오기 전에 영속성 컨텍스트에서 먼저 조회한다. 4. JPA에서 "save()"는 DB에 저장하는 것이 아니라 영속성 컨텍스트에 넣는 것이다. 1. 임베디드 타입 entityManger.clear() 유무에 따.. 2021. 10. 1.
Converter 사용하기 쿼리를 통해서 가져온 결과를 엔티티 객체로 만들 때 일부 칼럼을 변환하는 방법을 알아본다. db데이터와 객체가 형식이 다른 경우 어떻게 매핑하는지 살펴본다. @Converter로 쿼리의 형식을 바꿔줄 수 있다. 다른 시스템을 연동하거나, 레거시 데이터는 원하지 않는 형태로 데이터를 저장해야 하거나 저장된 경우가 있다. 여기서는 int값으로 상태를 표현하고 있는 과거의 보편화된 개발 방식에 대해 커스터마이징하도록 한다. int형 코드를 의미가 있는 객체로 변환하여 어플리케이션에서 사용하는 것은 ORM 규칙에 살짝 어긋나있다. public class Book { .. @Convert(converter = BookStatusConverter.class) private BookStatus status; //판매.. 2021. 9. 30.
반응형