Querydsl 2.9, Spring Data JPA 1.3.0 및 Hibernate JPA 2 API 버전 1.0을 사용하고 있습니다. 두 테이블 (Parent
및 Child
) 간의 간단한 조인을 시도하고 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,그러나, 실제로 실행되는 쿼리는 이것이다. childId
에 group by
을 입력하면 정확한 결과를 얻을 수 있지만, 불필요한 경우에는 cross join
의 추가 오버 헤드를 원하지 않습니다. 나는 innerJoin
과 join
을 사용하지 않으려 고 노력했다. 내가 Querydsl 워드 프로세서를 샅샅이 조사했는데 기본 조인 유형이 교차 조인이라는 것을 알 수 있으므로 아마도 조인을 올바르게 지정하지 않을 수 있습니까? 추가 교차 결합을 제거하려면 어떻게합니까?