- 참조: 자바 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<Member> cq = cb.createQuery(Member.class);
Root<Member> m = cq.from(Member.class);
cq.select(m)
.where(cb.ge(m.get("age"), 20));
List<Member> members = em.createQuery(cq)
.getResultList();
members.forEach(member -> {
System.out.println("Age: " + member.getAge());
});
위에 나오는 JPQL 을 문자열로 작성했을 때에는 컴파일 시간에 쿼리가 잘못되었는지 알 수 없지만 Criteria 는 코드로 JPQL 빌딩을 제공하여 문자열에서와 같은 실수를 할 일이 없다. 하지만 "age" 라는 속성을 참조할 때에는 여전히 그 위험요소가 남아 있다. 만약 "age" 대신 "agea" 라고 적어도 문자열이기 때문에 올바른 엔티티의 속성명인지 컴파일 시간에 판단할 길이 없다.
엔티티의 속성명까지 코드로 작성하고 싶다면 메타 모텔 API 를 이용해야 한다.
- 코드 생성기 설정
메타 모텔 API 는 엔티티에 대한 모델을 소스로 생성한다. 메이븐을 기준으로 pom.xml 에 아래 의존성을 추가한다.
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>5.3.7.Final</version>
</dependency>
............
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArguments>
<processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</processor>
</compilerArguments>
</configuration>
</plugin>
그리고 난 후 mvn compile 을 수행하면 코드가 생성된다.


메타 모델 적용전 m.get("age") 라고 표현했던 소스를 아래와 같이 사용할 수 있다.
cq.select(m)
.where(cb.ge(m.get(Member_.age), 20));
'Framework and Tool > JPA' 카테고리의 다른 글
JPA - 객체지향 쿼리 언어 - QueryDSL 검색조건, 페이징, 그룹 (0) | 2021.08.16 |
---|---|
JPA - 객체지향 쿼리 언어 - QueryDSL 시작 (0) | 2021.08.16 |
JPA - 객체지향 쿼리 언어 - Criteria 파라미터, 네이티브 함수 (0) | 2021.08.12 |
JPA - 객체지향 쿼리 언어 - Criteria 서브 쿼리 (0) | 2021.08.11 |
JPA - 객체지향 쿼리 언어 - Criteria 집합, 정렬, 조인 (0) | 2021.08.09 |
댓글