2013-11-14 17 views
22

Tôi muốn viết truy vấn như Select * from A a left join B b on a.id=b.id, Tôi mới làm quen với JPA dữ liệu Spring. Tôi không biết cách viết các thực thể cho Tham gia truy vấn.Tham gia hai thực thể bảng trong JPA dữ liệu Spring

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

thực thể khác là như

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

Tôi muốn viết một giao diện crudRepository. như

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

Bạn cần có mối liên hệ giữa các đơn vị của bạn. Không lưu trữ ID của các thực thể khác. Lưu trữ các tham chiếu đến các thực thể khác và sử dụng các liên kết OneToOne, ManyToOne, OneToMany và ManyToMany. Hướng dẫn JPA của bạn (hoặc tài liệu Hibernate), nên đề cập đến điều đó. –

+0

Hi Nizet, Cảm ơn bạn đã phản hồi nhanh, Bạn có bất kỳ Hướng dẫn nào có thể cung cấp cho tôi thêm thông tin về liên kết với các thực thể không. –

+0

Tìm kiếm OneToOne, OneToMany, ManyToOne và ManyToMany trong http://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html_single –

Trả lời

44

Nếu bạn muốn làm một mối quan hệ one-to-one, bạn nên thay đổi mã tiếp theo trong mô hình ReleaseDateType:

@Column(nullable = true) 
private Integer media_Id; 

cho:

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

và trong CacheMedia mô hình bạn cần thêm:

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

sau đó trong kho lưu trữ của bạn, bạn nên thay thế:

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

bởi:

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

hoặc bằng cách:

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

Hoặc nếu bạn muốn làm một @OneToMany@ManyToOne quan hệ, bạn nên thay đổi mã tiếp theo trong ReleaseDa mô hình teType:

@Column(nullable = true) 
private Integer media_Id; 

cho:

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

và trong mô hình CacheMedia bạn cần phải thêm:

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

sau đó trong kho lưu trữ của bạn, bạn nên thay thế:

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

bởi:

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

hoặc bằng cách:

@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

Xin chào Bigluis, Bạn có chắc chắn câu trả lời của bạn là chính xác không? Tôi đã thử nó và nhận được nó: 'Gây ra bởi: org.hibernate.AnnotationException: Nỗ lực bất hợp pháp để ánh xạ một bộ sưu tập không dưới dạng @OneToMany, @ManyToMany hoặc @CollectionOfElements: CacheMedia.releaseDateType' – qizer

+0

có vẻ như bạn nói đúng nên là 'List cachedMedias' thay vì' CacheMedia cachedMedia' –

+0

hoặc nếu bạn thích mối quan hệ một-một, bạn nên sử dụng '@ OneToOne' trong cả hai kiểu –

Các vấn đề liên quan