簡體   English   中英

使用彈簧數據jpa的關系的條件負載

[英]Conditional load of relations using spring data jpa

我正在開發一個多語言應用程序,而我的表也是為此目的而設計的。 例如,我有一個類似的Country類:

@Entity
@Table(name = "province")
public class Province {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "country_id", nullable = false)
    private Country country;

    @OneToMany
    @JoinColumn(name = "province_id")
    private List<ProvinceTranslation> translations;
}

@Entity
@Table(name = "province_translation")
public class ProvinceTranslation {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    private Language language;

    @ManyToOne
    @JoinColumn(name = "province_id")
    private Province province;
}

我希望translations字段僅加載指定語言的翻譯,而country字段也加載指定語言的翻譯( Country類顯然具有CountryTranslation列表!)。 我不想編寫查詢,我想使用我明確指定的語言來加載spring數據jpa。

在這種情況下,似乎需要編寫一些JPA查詢

因為缺少countryTranslation課程,所以我將重點放在Province課程上。

Language類也是未知的,也許這是一個enum ,如下所示:

public enum Language {UNKNOWN, GERMAN, ENGLISH, SPAIN}

為了避免加載實體的所有翻譯,您必須在從數據庫中獲取實體時根據給定的語言選擇翻譯。 我更喜歡利用Spring存儲庫 (希望您已經參與其中)進行此操作。 ProvinceRepository聲明

    public interface ProvinceRepository extends CrudRepository<Province, Long> {
    ...
    }

您必須提供所需的查找或計數方法。

要獲得具有特定翻譯的所有省的列表,您可以在ProvinceRepository聲明一個類似這樣的函數:

    @Query("SELECT new org.your.package.goes.here.Province(p.id, p.country, pt.name) FROM Province p inner join p.translations pt where pt.language = ?1")
    List<Province> findAllWithTranslation(Language language);

為了使它起作用,必須存在一個接受三個參數id, country, name的構造器。 可以將name參數設置為Province類的新translation屬性,或者分別設置為創建的province對象。 如果Language類確實是enum類, @Enumerated必須將@Enumerated批注添加到language字段。

不過,我堅信,在國際化圖書館(i18n)的幫助下,應該更好地提供翻譯字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM