복붙노트

[SPRING] Spring Data JPA에서 두 개의 테이블 엔티티 조인

SPRING

Spring Data JPA에서 두 개의 테이블 엔티티 조인

SELECT * FROM Release_date_type a.id = b.id의 LEFT JOIN cache_media b와 같은 쿼리를 작성하고 싶습니다. Spring Data JPA를 처음 사용합니다. Join 쿼리에 대한 엔티티를 작성하는 방법을 모르겠습니다. 다음은 시도입니다.

@Entity
@Table(name = "Release_date_type")
public class ReleaseDateType {

    @Id
    @GeneratedValue(strategy=GenerationType.TABLE)
    private Integer release_date_type_id;
    // ...
    @Column(nullable = true) 
    private Integer media_Id;
    // with getters and setters...
}

또 다른 실체는 :

@Entity
@Table(name = "Cache_Media")
public class CacheMedia {

    @Id
    @GeneratedValue(strategy=GenerationType.TABLE)
    private Integer id;
    // ...
    private Date loadDate; //with the getter and setter ..
}

나는 crudRepository 인터페이스를 쓰고 싶다.

public interface ReleaseDateTypeRepository extends CrudRepository<ReleaseDateType, Long>{
    @Query("SELECT * FROM Release_date_type a LEFT JOIN cache_media b on a.id=b.id")
    public List<ReleaseDateType> FindAllWithDescriptionQuery();
}

해결법

  1. ==============================

    1.하나 이상의 휴대폰을 소유 한 직원의 전형적인 예는이 위키 책 섹션을 참조하십시오.

    하나 이상의 휴대폰을 소유 한 직원의 전형적인 예는이 위키 책 섹션을 참조하십시오.

    예를 들어, 일대일 관계를 수행하려면 ReleaseDateType 모델에서 다음 코드를 변경해야합니다.

    @Column(nullable = true) 
    private Integer media_Id;
    

    에 대한:

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="CACHE_MEDIA_ID", nullable=true)
    private CacheMedia cacheMedia ;
    

    CacheMedia 모델에서는 다음을 추가해야합니다.

    @OneToOne(cascade=ALL, mappedBy="ReleaseDateType")
    private ReleaseDateType releaseDateType;
    

    저장소에서 다음을 대체해야합니다.

    @Query("Select * from A a  left join B b on a.id=b.id")
    public List<ReleaseDateType> FindAllWithDescriptionQuery();
    

    으로:

    //In this case a query annotation is not need since spring constructs the query from the method name
    public List<ReleaseDateType> findByCacheMedia_Id(Integer id); 
    

    또는 :

    @Query("FROM ReleaseDateType AS rdt WHERE cm.rdt.cacheMedia.id = ?1")    //This is using a named query method
    public List<ReleaseDateType> FindAllWithDescriptionQuery(Integer id);
    

    또는 @OneToMany와 @ManyToOne 관계를 원한다면 ReleaseDateType 모델의 다음 코드를 변경해야합니다.

    @Column(nullable = true) 
    private Integer media_Id;
    

    에 대한:

    @OneToMany(cascade=ALL, mappedBy="ReleaseDateType")
    private List<CacheMedia> cacheMedias ;
    

    CacheMedia 모델에서는 다음을 추가해야합니다.

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="RELEASE_DATE_TYPE_ID", nullable=true)
    private ReleaseDateType releaseDateType;
    

    저장소에서 다음을 대체해야합니다.

    @Query("Select * from A a  left join B b on a.id=b.id")
    public List<ReleaseDateType> FindAllWithDescriptionQuery();
    

    으로:

    //In this case a query annotation is not need since spring constructs the query from the method name
    public List<ReleaseDateType> findByCacheMedias_Id(Integer id); 
    

    또는 :

    @Query("FROM ReleaseDateType AS rdt LEFT JOIN rdt.cacheMedias AS cm WHERE cm.id = ?1")    //This is using a named query method
    public List<ReleaseDateType> FindAllWithDescriptionQuery(Integer id);
    
  2. from https://stackoverflow.com/questions/19977130/joining-two-table-entities-in-spring-data-jpa by cc-by-sa and MIT license