programing

스프링 데이터 JPA에서 두 테이블 도면요소 결합

sourcejob 2023. 3. 5. 09:44
반응형

스프링 데이터 JPA에서 두 테이블 도면요소 결합

나는 다음과 같은 질문을 쓰고 싶다.SELECT * FROM Release_date_type a LEFT JOIN cache_media b on a.id=b.idSpring Data JPA는 처음입니다.가입 쿼리에 엔티티를 쓰는 방법을 모릅니다.다음은 시도입니다.

@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대 또는 복수의 전화기를 소유하는 일반적인 예에 대해서는, 이 Wikibook 섹션을 참조해 주세요.

특정 예에서 관계를 설정할 경우 ReleaseDateType 모델에서 다음 코드를 변경해야 합니다.

@Column(nullable = true) 
private Integer media_Id;

대상:

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

또한 Cache Media 모델에서는 다음을 추가해야 합니다.

@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그리고.@ManyToOneReleaseDateType 모델의 다음 코드를 변경해야 합니다.

@Column(nullable = true) 
private Integer media_Id;

대상:

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

또한 Cache Media 모델에서는 다음을 추가해야 합니다.

@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);
@Query("SELECT rd FROM ReleaseDateType rd, CacheMedia cm WHERE ...")

이것은 오래된 질문이었지만 해결책은 매우 간단하다.휴지 상태에서 기준, 조인 등을 쓰는 방법을 잘 모를 경우 네이티브 쿼리를 사용하는 것이 가장 좋습니다.이로 인해 성능이 저하되지 않고 매우 유용합니다.아래 예

    @Query(nativeQuery = true, value = "your sql query")
returnTypeOfMethod methodName(arg1, arg2);

언급URL : https://stackoverflow.com/questions/19977130/joining-two-table-entities-in-spring-data-jpa

반응형