web-dev-qa-db-ja.com

Spring Data JPAで2つのテーブルエンティティを結合する

SELECT * FROM Release_date_type a LEFT JOIN cache_media b on a.id=b.idのようなクエリを書きたいです。 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();
}
39

従業員が1台以上の電話を所有している典型的な例については、 このwikibookセクション を参照してください。

特定の例では、one-to-one関係を実行する場合、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);
66
Luis Vargas