2013-11-14 41 views
22

我想編寫一個查詢像Select * from A a left join B b on a.id=b.id, 我是新來春數據JPA。 我不知道怎麼寫的聯接查詢實體。連接兩個表實體春數據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... 
} 

另一個實體是

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

我想寫一個crudRepository接口。 如

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

你需要你的實體之間的關聯。不要存儲其他實體的ID。存儲引用到其它實體,並使用OneToOne,多對一,一對多和多對多asociations。你的JPA教程(或者Hibernate文檔)應該覆蓋這個。 –

+0

嗨Nizet,感謝您的快速反應,你有哪些可以給我關於與實體相關聯的詳細信息的任何教程。 –

+0

搜索OneToOne,一對多,多對一和多對多的http://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html_single –

回答

44

如果你想要做一個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關係,你應該改變ReleaseDa中的下一個代碼teType型號:

@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

嗨,Bigluis, 你確定你的回答正確嗎?我試了一下,並收到它: '由...引起:org.hibernate.AnnotationException:非法嘗試將非集合映射爲@OneToMany,@ManyToMany或@CollectionOfElements:CacheMedia.releaseDateType' – qizer

+0

它看起來,你是對的,它應該是'List cachedMedias'而不是'CacheMedia cachedMedia' –

+0

或者如果你更喜歡一對一的關係,你應該在兩個模型中都使用'@ OneToOne' –