簡體   English   中英

Spring Data JPA方法,用於獲取具有連接表的實體

[英]Spring Data JPA method for getting the Entity with Joined table

我有一個非常具體的問題。 我有帶有某些變量的實體“ A”和與其他表“ B”的OneToMany關系。 我想創建查詢以使用Locale參數從表“ B”中獲取實體“ A”的id和值。

表B具有對實體的轉換。

例:

Entity A:
  id: 1
  var_1: "SDFA"
  OneToMany
  List<B> tabParam;

Entity B:
  id: 2
  value: "ASDF2"
  locale: "en-EN"
  id_A: 1

Entity B:
  id: 3
  value: "ASDF"
  locale: "fr-FR"
  id_A: 1

我想合並這兩個表以獲取語言環境“ fr-FR”:

[ {id: 1, value: "ASDF" }]

現在我得到:

[{ id: 1, tabParam: [ {value: "ASDF2"},{value : "ASDF"}]}]

我的JPA存儲庫中的方法:

List<A> findByTabParamLocale(Locale locale)

我正在使用Locale Hibernate轉換器,從實體到表以及從表到實體都沒有任何問題。

基於EntityB.id_A + EntityB.locale是唯一的。 使用波紋管投影代碼得到想要的東西:

// define the dto interface
public interface LocaleDto {
  Integer getId();
  String getLocale();
}

// define a interface method in your repository
@Query("select a.id, b.locale from EntityA a join a.tabParam b where b.locale = ?1")
List<LocaleDto> findByTabParamLocale(Locale locale)

// or use
@Query("select id_A as id, locale from EntityB where locale = ?1")

根據您的問題描述

基本上,您想獲取實體A的ID。此外,您的JPA方法看起來還不錯,只有您需要更改獲取實體A的ID。

代替

 List<A> findByTabParamLocale(Locale locale);

用這個

AIdDto findByTabParamLocaleProjectedBy(Locale locale);

AIdDto是投影界面。 您將創建如下

public AIdDto {

  Integer getId(); // This is id getter method of Enity A.
}

有關更多詳細信息。 請參考spring data jpa參考文檔。

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections

通過投影,您可以嘗試使用像這樣創建自定義項目值映射器bean的方法

修改AIdDto

 public AIdDto {

  @Value("#{target.id}")
  Integer getId();

  @Value("#{@projectionBean.getLocale(target)}")
  String getLocale();
}

創建ProjectionBean

@Component
class ProjectionBean {

  String getLocale(EntityA entityA) {
    //Write the logic for find the exact EntityB Locale
  }

}

但這不是優化的解決方案

暫無
暫無

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

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