본문 바로가기

Framework and Tool/JPA56

JPA - 객체지향 쿼리 언어 - 네이티브 SQL - 참조: 자바 ORM 표준 JPA 프로그래밍 - fieldResult 명세: https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/FieldResult.html - 네이티브 SQL 여태까지 많은 JPQL 의 기능들을 살펴보았다. 대부분의 표준 SQL 의 문법과 함수들을 지원하지만 특정 상황에서는 어쩔 수 없이 DB 제품군에 따른 특화된 기능을 사용해야할 때가 있다. (ex - 특정 함수, 문법, SQL 힌트, 인라인 뷰, 스토어드 프로시져...) JPA 는 이런 상황에 대비해 SQL 을 직접 사용할 수 있는 기능을 제공하는데 이를 네이티브 SQL 이라고 한다. 네이티브 SQL 을 사용할거면 JPA 를 굳이 사용하지 않아도 될텐데 왜 JPA 의 .. 2021. 8. 27.
JPA - 객체지향 쿼리 언어 - QueryDSL 메소드 위임 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 메소드 위임 메소드 위임을 사용하면 쿼리 타입에 검색 조건을 직접 정의할 수 있다. public class MemberExpression { @QueryDelegate(Member.class) public static BooleanExpression isAdult(QMember member) { return member.age.gt(19); } } Member 엔티티가 성인인지를 판단하는 검색조건을 추가해본다고 가정하자. 메소드 위임 기능을 사용하려면 static 메소드를 만들고 @QueryDelegate 어노테이션을 지정한다. 어노테이션 인자에는 해당 기능을 적용할 엔티티를 설정한다. 메소드의 첫번째 파라미터에는 Q-type 을 지정하고 나머지는 필요한.. 2021. 8. 26.
JPA - 객체지향 쿼리 언어 - QueryDSL 배치쿼리, 동적쿼리 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 수정, 삭제 배치쿼리 QueryDSL도 수정, 삭제 같은 배치쿼리를 지원한다. JPQL 배치쿼리와 같이 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리를 수행한다. JPQL 배치는 추후에 다루도록 한다. QMember m = new QMember("m"); JPAUpdateClause updateClause = new JPAUpdateClause(em, m); updateClause.where(m.name.startsWith("Name")) .set(m.age, m.age.add(1)) .execute(); JPAQueryFactory query = new JPAQueryFactory(em); List members = query.select(m) ... 2021. 8. 24.
JPA - 객체지향 쿼리 언어 - QueryDSL 프로젝션 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 프로젝션 (Tuple) 조회를 하다보면 하나의 엔티티 형태가 아닌 여러 컬럼으로 이루어진 정보를 조회해야 할 때가 있다. 이때에는 JPQL 에서 살펴본것과 같이 Map 과 비슷한 방식의 Tuple 을 사용하면 된다. JPAQueryFactory query = new JPAQueryFactory(em); QMember m = new QMember("m"); List members = query.select(m.name, m.age) .from(m) .where(m.age.gt(10)) .fetch(); members.forEach(member -> { System.out.println("Member's name: " + member.get(m.name) +.. 2021. 8. 21.
JPA - 객체지향 쿼리 언어 - QueryDSL Join, 서브쿼리 - 참조: 자바 ORM 표준 JPA 프로그래밍 - Join QueryDSL 에서 Join 은 innerJoin, leftJoin, rightJoin, fullJoin 을 지원한다. 또한 JPQL 의 on 과 fetch 기능도 사용가능하다. join 을 사용할때에는 1번째 파라미터에 조인 대상을, 2번째 파라미터에 alias 를 지정한다. 귀찮지만 Join 예제를 실행해보기 위해 Member 엔티티와 Order 엔티티가 맵핑된 데이터를 만들어주자. Member member1 = new Member(); member1.setName("Name#1"); member1.setAge(10); member1.setAddress( new Address("City#1", "Street#1", "Zipcode#1"));.. 2021. 8. 18.
JPA - 객체지향 쿼리 언어 - QueryDSL 검색조건, 페이징, 그룹 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 검색조건 QueryDSL 에서 검색조건 where 절의 기본 사용법을 알아보자. JPAQueryFactory query = new JPAQueryFactory(em); QMember qMember = QMember.member; List members = query.select(qMember) .from(qMember) .where(qMember.age.gt(20) .and(qMember.address.city.eq("City#2"))) .orderBy(qMember.age.desc()) .fetch(); members.forEach(member -> { System.out.println("Member age: " + member.getAge()); }).. 2021. 8. 16.
JPA - 객체지향 쿼리 언어 - QueryDSL 시작 - 참조: 자바 ORM 표준 JPA 프로그래밍 - QueryDSL 시작 여태까지 살펴본 Criteria 는 문자열로 작성한 JPQL 과는 다르게 문법 오류를 컴파일에서 잡을 수 있었지만 코드를 살펴보면 직관적이지 않은 부분이 있었다. QueryDSL 은 HQL 을 코드로 작성하기 위한 오픈소스 프로젝트 였지만 현재는 JPA, JDO, JDBC 등 여러 디비 제품군을 지원하고 있다. - 설정 JPA 카테고리 JPA - 객체지향 쿼리 언어 - 개요 글에서 QueryDSL 설정법을 살펴본적이 있지만 다시 한번 살펴보도록 하자. com.querydsl querydsl-apt provided com.querydsl querydsl-jpa ............ com.mysema.maven apt-maven-pl.. 2021. 8. 16.
JPA - 객체지향 쿼리 언어 - Criteria 메타 모델 API - 참조: 자바 ORM 표준 JPA 프로그래밍 - 메타모델 API 설정: https://docs.jboss.org/hibernate/orm/5.4/topical/html_single/metamodelgen/MetamodelGenerator.html - 메타 모델 API 객체 지향 쿼리언어에서 JPQL 과 Citeria 를 살펴보았다. select generatedAlias0 from Member as generatedAlias0 where generatedAlias0.age>=20 ...................... CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Member.class); Root m =.. 2021. 8. 13.
JPA - 객체지향 쿼리 언어 - Criteria 파라미터, 네이티브 함수 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 파라미터 JPQL 에서 :username 으로 파라미터를 정의한것처럼 Criteria 에서도 해당 기능을 제공한다. CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Member.class); Root m = cq.from(Member.class); cq.select(m) .where(cb.equal(m.get("name"), cb.parameter(String.class, "userNameParam"))); List members = em.createQuery(cq) .setParameter("userNameParam", "Name#4") .getResultLi.. 2021. 8. 12.
JPA - 객체지향 쿼리 언어 - Criteria 서브 쿼리 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 서브 쿼리 Criteria 로도 서브쿼리를 작성할 수 있다. 메인의 테이블과 연관된 서브쿼리와 메인의 테이블이 연관되지 않은 간단한 서브쿼리를 알아보도록 한다. - 간단한 서브쿼리 메인 테이블과 아무런 연관이 없는 간단한 서브쿼리부터 알아보도록 하자. 평균나이보다 나이가 많은 Member 엔티티만 조회해보자. JPQL 로 표현하면 "select m from Member m where m.age >= (select AVG(m2.age) from Member m2)" 과 같이 될 것이다. 데이터는 앞의 글에서 사용했던 아래 데이터를 이용한다. Member member1 = new Member(); member1.setName("Name#1"); member1.. 2021. 8. 11.