2013-11-14 12 views
22

Chcę napisać zapytanie takie jak: Select * from A a left join B b on a.id=b.id, Jestem nowy w Spring Data JPA. Nie wiem, jak napisać elementy do zapytania Przyłącz się.Łączenie dwóch elementów tabeli w Spring Data JPA

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

    @Id 
    @GeneratedValue(strategy=GenerationType.TABLE) 
    private Integer release_date_type_id; 
    @Column 
    private Integer sort_order; 
    @Column 
    private String description; 
    @Column 
    private String data_source_type; 
    @Column(nullable = true) 
    private Integer media_Id; 
    @Column 
    private String source_system; 
    @Column 
    private String update_Name; 
    @Column 
    private Date update_Date; 
    @Column 
    private String create_Name; 
    @Column 
    private Date create_Date; 
    @Column 
    private Integer version_Id; 
    @Column(nullable = true) 
    private Integer auto_Firm_Flag; 
    @Column(nullable = true) 
    private Integer auto_Firm_Months; 
    @Column(nullable = true) 
    private Integer auto_Firm_Days; 
    with getters and setters... 
} 

Kolejnym podmiotem jest

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

@Id 
@GeneratedValue(strategy=GenerationType.TABLE) 
private Integer id; 
@Column(name="code") 
private String code; 
@Column(name="POSITION") 
private Integer position; 
@Column(name="DESCRIPTION") 
private String media_Description; 
@Column(name="LOAD_DATE") 
private Date loadDate; with the getter and setter ..} 

Chcę napisać crudRepository interfejs. takich jak

public interface ReleaseDateTypeRepository extends CrudRepository<ReleaseDateType, Long>{ 
    @Query("Select * from A a left join B b on a.id=b.id") 
public List<ReleaseDateType> FindAllWithDescriptionQuery(); 
} 
+5

Trzeba stowarzyszenie między swoimi jednostkami. Nie przechowuj identyfikatorów innych podmiotów. Przechowuj odniesienia do innych podmiotów i stosuj asocjacje OneToOne, ManyToOne, OneToMany i ManyToMany. Wasz samouczek JPA (lub dokumentacja Hibernate) powinien to uwzględnić. –

+0

Cześć Nizet, dziękuję za szybką odpowiedź, czy masz jakieś samouczki, które mogą dać mi więcej informacji o skojarzeniu z podmiotami. –

+0

Wyszukaj OneToOne, OneToMany, ManyToOne i ManyToMany w http://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html_single –

Odpowiedz

44

Jeśli chcesz zrobić relację one-to-one należy zmienić następny kod w modelu ReleaseDateType:

@Column(nullable = true) 
private Integer media_Id; 

dla:

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

iw CacheMedia model, który należy dodać:

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

następnie w repozytorium należy wymienić:

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

przez:

//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); 

lub przez:

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

Lub jeśli wolisz zrobić @OneToMany i @ManyToOne relację, powinieneś zmienić następny kod w ReleaseDa teType model:

@Column(nullable = true) 
private Integer media_Id; 

dla:

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

aw modelu CacheMedia trzeba dodać:

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

następnie w repozytorium należy wymienić:

@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); 

lub przez:

@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

Witam Bigluis, Czy jesteś pewien, że twoja odpowiedź jest prawidłowa? Próbowałem go i otrzymałem: 'Spowodowane przez: org.hibernate.AnnotationException: Niedozwolona próba mapowania kolekcji jako @OneToMany, @ManyToMany lub @CollectionOfElements: CacheMedia.releaseDateType' – qizer

+0

Wygląda na to, że masz rację. powinno być 'List cachedMedias' zamiast' CacheMedia cachedMedia' –

+0

lub jeśli wolisz relację jeden-do-jednego powinieneś użyć '@ OneToOne' w obu modelach –

Powiązane problemy