2017-11-29 4 views
0

관계에 4 개의 테이블이 있습니다. A, B, C, D.Jpa 관계로 선택

select NEW org.example.ExtendsA(a,b.name,c.name,d.name) 
from A a LEFT JOIN a.bItems b LEFT JOIN a.cItems c LEFT JOIN b.dItems d 
order by b.name ASC; 

A는 독특하지만 관계 incomplette 있습니다

그래서 나는 선택 울부 짖는 소리를 썼다.

나는이 시도 :

select NEW org.example.ExtendsA(a,b.name,c.name,d.name) 
from A a LEFT JOIN FETCH a.bItems b LEFT JOIN FETCH a.cItems c 
LEFT JOIN FETCH b.dItems d order by b.name ASC; 

A가 고유하지 않습니다를.

한 개체 정의는 다음과 같습니다

@Entity 
public class A implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID") 
    private Long id; 

    @NotNull 
    @Size(min = 1, max = 100) 
    @Column(name = "NAME") 
    private String name; 

    @OneToMany(mappedBy = "aId") 
    private List<B> bItems; 

    @OneToMany(mappedBy = "aId") 
    private List<C> cItems; 

} 

어떤 관계 비어 있습니다 만, null 관계가있는 객체가 필요합니다. 일부 개체는 B와 C 사이에 둘 이상의 관계가 있으며 하나의 A 개체 (별개 A)에서 모두 함께 선택하려고합니다.

이 문제를 해결하는 방법을 알려주십시오. 어쩌면 접근 방식이 좋지 않을까요?

나는 EclipeLink 데이터 공급자를 사용합니다.

+2

고유 한 의미는 무엇입니까? 그것은 테이블입니다 –

+0

나의 목표는 : 객체 A는 select에 한 번만 나타나고 관계를 포함합니다. 이 환경에서 독특한 단어는 좋은 선택이 아닐 수도 있습니다. – Zaosz

+0

예 : distinct (A) – Zaosz

답변

0

이것은 OneToMany relathionships을로드 할 때 일반적인 문제입니다.

이는 SQL 결과 세트의 특성 때문입니다. 엔티티와 연결된 다른 엔티티와의 SQL 결과를 상상해보십시오. 왼쪽에는이 엔티티의 필드가 관련된 엔티티의 수만큼 복제됩니다.

유감스럽게도, EclipseLink는이를 필터링하지 않으며 결과에서 동일한 엔티티의 많은 항목을 가져옵니다. 비록 EclipseLink가 충분히 똑똑하고 각 항목은 실제로 동일한 Java 객체 인스턴스입니다.

이러한 쿼리에서 setMaxResults을 사용할 수없는 이유이기도합니다.

distinct 키워드를 사용해야합니다.이 특정 키에는 실제 SQL 고유 문자로 매핑되지 않지만 중복 된 엔터티는 필터링됩니다. 또는 필터를 수동으로 필터링 할 수 있습니다.

관련 문제