코드 생성을 할 수 없는 경우, 표현식 생성을 위한 경로 참조 목적으로 별칭 객체를 사용할 수 있다. 자바빈 객체의 프록시를 생성하고 프록시 객체의 getter 메서드를 경로로 사용할 수 있다.
다음 예제는 생성된 타입을 이용한 표현식 생성을 대신해서 어떻게 별칭 객체를 사용할 수 있는 보여준다.
먼저 다음 예제는 APT가 생성된 도메인 타입을 이용해서 쿼리를 실행하는 코드를 보자.
QCat cat = new QCat("cat"); for (String name : query.from(cat,cats) .where(cat.kittens.size().gt(0)) .list(cat.name)) { System.out.println(name); }
그리고, 다음은 Cal 클래스를 이용해서 별칭 인스턴스를 사용하는 예이다.
$ 메서드 파라미터인 c.getKittens()
는 내부적으로 프로퍼티 경로 c.kittens
로 변환된다.
Cat c = alias(Cat.class, "cat"); for (String name : query.from($(c),cats) .where($(c.getKittens()).size().gt(0)) .list($(c.getName()))) { System.out.println(name); }
별칭 기능을 사용하려면 다음의 두 import를 추가해야 한다.
import static com.mysema.query.alias.Alias.$; import static com.mysema.query.alias.Alias.alias;
다음 예는 앞 예제의 변형이다. $ 메서드 안에서 리스트의 size()에 접근하고 있다.
Cat c = alias(Cat.class, "cat"); for (String name : query.from($(c),cats) .where($(c.getKittens().size()).gt(0)) .list($(c.getName()))) { System.out.println(name); }
기본 데이터 타입이 아니고 final이 아닌 모든 별칭 프로퍼티는 별칭 자체이다. 따라서, $ 메서드 내에서 기본 데이터 타입이나 final 타입이 나오기 전까지 메서드를 이어서 호출할 수 있다. 다음은 예이다.
$(c.getMate().getName())
is transformed into *c.mate.name* internally, but
$(c.getMate().getName().toLowerCase())
이 코드는 내부적으로 toLowerCase()
으로 변환된다.
별칭 타입에서는 getters, size(), contains(Object), get(int)만 호출할 수 있음에 유의하자. 모든 다른 메서드 호출은 익셉션을 발생시킨다.