[英]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.