2012-04-27 6 views
0

이 종류의 sql에 대해 CriteriaBuilder를 사용하여 쿼리를 만들고 싶습니다.CriteriaBuilder 및 선택 원인에 별칭 사용

SELECT myDefinedAlias.id, myDefinedAlias.name, myDefinedAlias.aFieldForFK select from Person as myDefinedAlias where myDefinedAlias.name = ?1 

어떻게이 별칭을 정의 할 수 있습니까?

내가 별칭없이 쿼리를 만들 수 있지만 내가 별칭을 정의 할 수 없습니다 ...

CriteriaQuery<Person> cq = criteriBuilder.createQuery(Person.class); 
Root<Person> person = cq.from(Person.class); 
cq = cq.select(person); 
cq = cq.where(criteriaBuilder.equal(person.get(Person_.name), "Chivas"))) 

나는 일괄 가져 오기, QueryHints이 필요합니다.

.setHint(QueryHints.BATCH, "myDefinedAlias.aFieldForFK.itsNestedAttribute"); 

내가 갇혀있어 내 문제와 관련하여 아무 것도 찾을 수 없습니다. 누군가?

감사합니다.

답변

0

나는이 잘못된 방향으로 가고 있다고 생각합니다. JPA는 SQL 문을 생성 할 때 SQL 문 별칭이 필요합니다. 중첩 된 쿼리 힌트가 작동하려면 관계를 엔터티에 지정해야합니다. 예를 들어 Person 엔터티에 House 엔터티에 OneToMany 매핑이 있고 Person 클래스의 속성 이름이 livedInHouses 인 경우. 쿼리 힌트는 .setHint (QueryHints.BATCH, "Person.livedInHouses")가됩니다. 데이터베이스에 존재하는 FK를 사용할 수는 없지만 JPA의 엔티티에 대한/관계에 주석이 달린 것은 아닙니다.

+0

늦게 답변 해 주셔서 ... 죄송합니다. 네가 옳았습니다. 나는 "Person"어노테이션으로 가져올 수 있는지 확인했다. 쿼리 작성 방법을 변경해야했습니다. 당신의 도움을 주셔서 감사합니다! –

1

Doing cq.select(person).alias("myDefinedAlias")은 배치/불러 오기 쿼리 힌트에서 나중에 사용할 수있는 별칭을 할당합니다. Eclipselink는 여러 관계 (콜렉션)로 전송하지 않는 한 중첩 된 페치 조인을 지원합니다. 즉, .setHint(QueryHints.BATCH, myDefinedAlias.toOneRelation.toManyRelation")은 작동하지만 .setHint(QueryHints.BATCH, .setHint(QueryHints.BATCH, "myDefinedAlias.toManyRelation.toOneRelation")은 안됩니다.