2016-03-02 45 views
0

我有4個JPA實體如下:定製@Query春數據倉庫通過多個實體

實體Farm

@Entity 
public class Farm implements Serializable { 

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long idFarm; 
    private String nameFarm; 
} 

實體SAU

@Entity 
public class SAU implements Serializable { 

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long idSau; 
    private String nameSau; 
    @OneToOne 
    @JoinColumn(name="farm_id") 
    private Farm farm; 
} 

實體Part

@Entity 
public class Part implements Serializable { 

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long idPart; 
    private String namePart; 
    @ManyToOne 
    @JoinColumn(name = "sau_id") 
    private Sau sau; 
} 

實體Cult

@Entity 
public class Cult implements Serializable { 

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long idCult; 
    private String nameCult; 
    @OneToOne 
    @JoinColumn(name = "part_id") 
    private Part part; 
} 

我需要通過使用類似方法的公約命名檢索CultCollection一個對象在哪裏farm_id = x,我顯然無法做到這一點:

public Collection<Cult> = findCultByPartBySauByFarmIdFarm(Long idFarm); 

我可以不知道如何在Spring Data Repository中爲這種情況編寫定製@Query

回答

2

嘗試:

@Query("select c from Cult c join c.part p join p.sau s join s.farm f where f.idFarm = ?1") 
public Collection<Cult> = findCultByFarmId(Long idFarm); 
+0

@Rallph我得到這個錯誤:'引起:java.lang.IllegalArgumentException:org.hibernate.hql.internal.ast.QuerySyntaxException:加入的路徑! [從cult中選擇c c加入部分p加入p.sau s加入s.farm f其中f.idFarm =:x]' – dwix

+0

哦,我解決了這個問題,你需要在'part'之前加一個'c':' ..c加入c.part..',那是失蹤的路徑。謝謝。 – dwix

+0

@dwix:抱歉,我的錯,你修好了,我更新了答案 – Ralph

2

另一個版本沒有明確的連接。

@Query("select c from Cult c where c.part.sau.farm.idFarm = ?1") 
public Collection<Cult> = findCultByFarmId(Long idFarm); 

我通常更喜歡使用這個,因爲我讓下劃線實現來處理我的連接。

+0

哦,謝謝它的工作。我之前嘗試過,但沒有奏效,我想我錯過了一些東西。 – dwix

+1

當你的關係定義得很好時,你只需要把查詢寫成一個正常的面向對象的方法。 – Desorder

+0

我明白了,謝謝:) – dwix