2014-12-18 3 views
2

JPA에서 하나의 엔티티에 2 개의 다른 테이블에서 데이터를 가져 오려고했으나 결과가 없습니다.JPA 명명 된 쿼리를 사용하여 여러 테이블에서 단일 POJO로 가져 오기

두 개의 서로 다른 테이블의 데이터를 유지하는 엔티티는 아래와 같다 :

@Data @Entity @JsonSnakeCase 

public class WareHouse { 

    @Id 
    @GeneratedValue 
    private long id; 

    @Column(unique = true) 
    private String fcId; 

    @Enumerated(EnumType.STRING) 
    private FCStatus status; 

    @OneToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER, mappedBy = "fcId") 
    private List<WorkingHours> workingHours; 

    @Enumerated(EnumType.STRING) 
    private IntegrationType integrationType; 
} 

다른 엔티티 WorkingHours는 :

@Data 
@Entity 
@JsonSnakeCase 
public class WorkingHours { 
    @Id 
    @GeneratedValue 
    private long id; 

    private String fcId; 
    private LocalDate date; 
    private DateTime start; 
    private DateTime end; 
} 

테이블 WareHouseWorkingHours는 일대 다 관계가 있고 fcId은 이들을 조인하는 열입니다.

내 경우에는 WareHouse 세부 사항과 WorkingHours을 위에서 정의 된대로 단일 엔터티 WareHouse에 가져와야합니다. 이것을 어떻게 성취합니까?

아래의 명명 된 쿼리는 WareHouse 데이터 만 가져오고 WorkingHours은 비어 있습니다. 데이터 모델이 잘못 되었습니까? 또는 쿼리가 잘못 되었습니까?

<named-query name="searchByFcId"> 
     <query> 
      <![CDATA[ 
      select f from WareHouse f where f.fcId = :fc_id 
      ]]> 
     </query> 
    </named-query> 
+0

괜찮아 보이지만, 당신은'Warehouse' 엔티티와'WorkingHours' 엔티티 모두 FCID대로 어쩌면 그것은 혼란스러워지고, 그래서 실제 매핑 열이 fcId가 아님을 알 수 있습니다. FK가 무엇인지 확인하려면 실제 DB를 확인하십시오. –

+0

fcID는 DB의 외래 키입니다. – gaganbm

+0

하지만 창고의 PK는 그 필드를 참조하는 필드가 아닙니다. –

답변

2

당신은 다음과 같은 매핑을 시도 할 수 있습니다 (I은 주석 OneToManyFetchType 등을 부여 할 때 JPA가 자동으로 관련 테이블에서 가져 오는 돌볼 것이라고 생각). JPA 2.0 스펙 노트 (11.1.21) 주 :

If the referencedColumnName element is missing, the foreign key is assumed to 
refer to the primary key of the referenced table. 

그러나이 또한주의에 간다 :

Support for referenced columns that are not primary key columns of the 
referenced table is optional. Applications that use such mappings 
will not be portable. 

이 공급자에 따라 달라집니다 작동 여부 그래서.

창고 :

@Data 
@Entity 
@JsonSnakeCase 
public class WareHouse { 

    @Id 
    @GeneratedValue 
    private long id; 

    @Column(unique = true) 
    private String fcId; 

    @Enumerated(EnumType.STRING) 
    private FCStatus status; 

    @OneToMany(mappedBy = "warehouse", cascade = CascadeType.PERSIST, fetch = FetchType.EAGER) 
    private List<WorkingHours> workingHours; 

    @Enumerated(EnumType.STRING) 
    private IntegrationType integrationType; 
} 

WorkingHours :

@Data 
@Entity 
@JsonSnakeCase 
public class WorkingHours { 

    @Id 
    @GeneratedValue 
    private long id; 

    @ManyToOne 
    @JoinColumn(name = "fcId", referencedColumnName="fcid") 
    private Warehouse warehouse; 

    private LocalDate date; 
    private DateTime start; 
    private DateTime end; 
} 
+0

예. 이것으로 해결했습니다. 나중에 직렬화 오류를 피하기 위해 날짜 유형에 jadira 시간 유형에 주석을 달았고 무한 루프를 피하기 위해 참조 된 객체에 JsonIgnoreProperties를 수행해야했습니다. 그러나 그렇습니다, 이것은 내가 요청한 원래의 문제를 해결했습니다. 고맙습니다. – gaganbm

+0

좋습니다. 관계를 양방향으로 만들 필요가 없습니다 (무한 루프가 발생 함). WorkingHour> Warehouse 매핑을 제거하고 '@JoinColumn'주석을 '@OneToMany'in Warehouse로 이동하고 mappedBy를 제거하면이 문제가 해결되고 모든 것이 예상대로 작동합니다. 흥미 롭군요. –

+0

. 나는 그것을 시도 할 것이다. – gaganbm