2013-11-14 12 views
22

Ich möchte eine Abfrage wie Select * from A a left join B b on a.id=b.id, Ich bin neu in Spring Data JPA. Ich weiß nicht, wie Sie Entitäten für die Join-Abfrage schreiben.Joining zwei Tabellenentitäten in 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... 
} 

Ein weiteres Unternehmen ist als

@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 ..} 

ich eine crudRepository Schnittstelle schreiben möchten. wie

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

Sie benötigen einen Zusammenhang zwischen Ihren Einheiten. Speichern Sie keine IDs anderer Entitäten. Speichern Sie Verweise auf andere Entitäten und verwenden Sie die OneToOne-, ManyToOne-, OneToMany- und ManyToMany-Assoziationen. Ihr JPA-Lernprogramm (oder die Hibernate-Dokumentation) sollte dies abdecken. –

+0

Hallo Nizet, Danke für die schnelle Antwort, haben Sie irgendwelche Tutorials, die mir mehr Informationen über die Assoziation mit den Entitäten geben können. –

+0

Suche nach OneToOne, OneToMany, ManyToOne und ManyToMany in http://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html_single –

Antwort

44

Wenn Sie eine one-to-one Beziehung tun möchten, sollten Sie den nächsten Code in ReleaseDateType Modell ändern:

@Column(nullable = true) 
private Integer media_Id; 

für:

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

und in CacheMedia Modell, das Sie hinzufügen müssen:

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

dann in Ihrem Repository sollten Sie ersetzen:

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

von:

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

oder von:

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

Oder wenn Sie es vorziehen, ein @OneToMany und @ManyToOne zu tun Beziehung, sollten Sie den nächsten Code in ReleaseDa ändern teType Modell:

@Column(nullable = true) 
private Integer media_Id; 

für:

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

und in CacheMedia Modell müssen Sie hinzufügen:

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

dann in Ihrem Repository sollten Sie ersetzen:

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

von:

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

oder von:

@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

Hallo Bigluis, Sind Sie sicher, dass Ihre Antwort richtig ist? Ich versuchte es und erhielt es: 'verursacht durch: org.hibernate.AnnotationException: Illegaler Versuch, eine Nichtansammlung als @OneToMany, @ManyToMany oder @CollectionOfElements zuzuordnen: CacheMedia.releaseDateType' – qizer

+0

es schaut, Sie haben Recht, es sollte 'List cachedMedias' anstelle von' CacheMedia cachedMedia' sein –

+0

oder wenn Sie eine Eins-zu-Eins-Beziehung bevorzugen, sollten Sie '@ OneToOne' in beiden Modellen verwenden –