본문 바로가기
Framework and Tool/JPA

JPA - 객체지향 쿼리 언어 - Criteria 메타 모델 API

by ocwokocw 2021. 8. 13.

- 참조: 자바 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));

댓글