我目前正在努力處理一個我知道這是可能的查詢,但由于我在 SQL 查詢方面的技能很差,我無法真正找到正確的句子。
我想找到某個區域的所有領土。每個 Zone 包含多個 Territory,但一個 Territory 可以屬于一個 Zone。物體如下:
public class Territory {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
private String name;
private Long owned_player;
@OneToMany
private List<Territory> neighbors;
private int no_of_armies;
public Territory(String name) {
this.no_of_armies = 0;
this.neighbors = new ArrayList<>();
this.name = name;
//this.owned_player = new Player(0);
this.owned_player = null;
}
@Entity
public class Zone {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String name;
private String map;
//private int control_value;
@OneToMany
private List<Territory> territories;
public Zone(String name, String map) {
this.territories = new ArrayList<>();
this.name = name;
this.map = map;
//this.control_value = control_value;
}
我必須插入查詢的存盤庫如下所示:
public interface TerritoryRepository extends JpaRepository<Territory,Long> {
@Query("????")
public List<Territory> findAllTerritoriesByZone(String zone);
}
例如,我正在嘗試查找將回傳屬于亞洲(中國、日本、臺灣...)或歐洲(西班牙、法國、德國...)的所有領土的查詢。
感謝您的幫助和關注!
uj5u.com熱心網友回復:
您的示例存在一些問題,一旦您開始運行它就會出現問題,但現在我將專注于您的具體問題的答案。
在您的示例中,Zone 和 Territory 之間的關系是單向的。Zone#territories意味著如果你有一個區域,你可以導航到它的領土。但是由于 Territory 沒有提到 Zone,所以你不能遍歷那個方向——這對你的問題來說是個問題,因為這實際上就是你想要做的。
因此,您需要做的第一件事就是使關系成為雙向的。
您可以通過在Territory類中添加對 Zone 的參考來做到這一點:
@ManyToOne
@JoinColumn(name = "ZONE_ID")
private Zone zone;
然后Zone#territories用一個mappedBy屬性更新,這樣JPA實作就可以理解這兩個欄位是相互參考的。
@OneToMany(mappedBy = "zone")
private List<Territory> territories = new ArrayList<>();
有了它,您現在可以從存盤庫中的區域參考區域。在您的存盤庫中,我不清楚該zone引數應該指的是什么 - 區域的名稱?如果是這樣,您可以使用此查詢來查找具有特定名稱的區域的區域:
// in TerritoryRepository
@Query("select t from Territory t join t.zone where t.zone.name = :zone")
public List<Territory> findAllTerritoriesByZone(String zone);
也可以使用常規派生查詢來表達這一點,在這種情況下,您根本不需要指定@Query/JPQL:
List<Territory> findAllByZoneName(String zone);
該示例的其他問題:
Territory需要@Entity注釋Territory#neighbors表示為@OneToMany關系。這可能應該是一種@ManyToMany關系,因為您可以有很多鄰居,每個鄰居自己也有很多鄰居。為了這個答案的其余部分,我將其注釋掉。- 你的
Territory并且Zone沒有默認建構式。JPA 要求物體具有默認的公共/受保護建構式,以便它可以反射地實體化它們。我重新添加了這些以使示例正常作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/479996.html
標籤:sql PostgreSQL 弹簧靴 弹簧数据-jpa
