2013-06-12 4 views
1

Querydsl 2.9, Spring Data JPA 1.3.0 및 Hibernate JPA 2 API 버전 1.0을 사용하고 있습니다. 두 테이블 (ParentChild) 간의 간단한 조인을 시도하고 parentId 열에 합류하려고합니다. 어떤 이유로 Hibernate에 의해 실행되는 질의는 항상 cross join을 가진다. 표는 다음과 같다 :Extra Cross Spring Join with JPA & Querydsl

CREATE TABLE PARENT (
    PARENTID INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    NAME VARCHAR(255) 
); 

CREATE TABLE CHILD (
    CHILDID INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    PARENTID INT(11), 
    NAME VARCHAR(255) 
); 

도메인 클래스는 다음과 같이 :

private List<Parent> test(List<Integer> parentIds) { 
    JPAQuery query = new JPAQuery(entityManagerFactory.createEntityManager()); 
    QParent qParent = QParent.parent; 
    QChild qChild = QChild.child; 

    List<Parent> parents = query.from(qParent, qChild) 
     .innerJoin(qParent.children, qChild) 
     .where(qParent.parentId.in(parentIds)) 
     .list(qParent); 

     return parents; 
} 

내가 뭔가를보고 생성 된 쿼리를 기대 :

@Entity 
@Table(name="PARENT") 
public class Parent { 

    @Id 
    @GeneratedValue 
    private Integer parentId; 

    private String name; 

    @OneToMany 
    @JoinColumn(name="parentId") 
    private List<Child> children; 

    // ... getters/setters omitted for brevity 
} 

@Entity 
@Table(name="CHILD") 
public class Child { 

    @Id 
    @GeneratedValue 
    private Integer childId; 

    private Integer parentId; 

    private String name; 

    // ... getters/setters omitted for brevity 
} 

내 쿼리 코드는 다음과 같습니다 이렇게 :

select 
    p.parentId, p.name 
from 
    parent p 
     inner join 
    child c on c.parentid = p.parentid 
where 
    p.parentid in(1, 2); 
select 
    parent0_.parentId as parentId1_3_, parent0_.name as name2_3_ 
from 
    PARENT parent0_ 
     inner join 
    CHILD children2_ ON parent0_.parentId = children2_.parentId 
     cross join 
    CHILD child1_ 
where 
    parent0_.parentId in (1 , 2); 

공지 끝에 추가 cross join : 414,그러나, 실제로 실행되는 쿼리는 이것이다. childIdgroup by을 입력하면 정확한 결과를 얻을 수 있지만, 불필요한 경우에는 cross join의 추가 오버 헤드를 원하지 않습니다. 나는 innerJoinjoin을 사용하지 않으려 고 노력했다. 내가 Querydsl 워드 프로세서를 샅샅이 조사했는데 기본 조인 유형이 교차 조인이라는 것을 알 수 있으므로 아마도 조인을 올바르게 지정하지 않을 수 있습니까? 추가 교차 결합을 제거하려면 어떻게합니까?

답변

1

두 번째 인수는 아마도 교차 결합을 담당합니다.

하면이 대신

List<Parent> parents = query.from(qParent) 
    .innerJoin(qParent.children, qChild) 
    .where(qParent.parentId.in(parentIds)) 
    .list(qParent); 
시도