簡體   English   中英

構造函數中的Spring Data JPA JPQL列表

[英]Spring Data JPA JPQL list in constructor

在我的應用程序中(一種非標准情況),我在mysql中有一個實體層,在控制器中有一個dominain層。 我的域模型包含一些實體,可以將其集成到一個JPQL查詢中嗎?

實體層:

PersonEntity表

EventEntity表

EventVisitorEntity表

  1. PersonEntity多對多EventEntity

  2. EventVisitorEntity臨時表

域層:

class PersonInfo {
Person person;
List<PersonEvent> personEvent
...
}

現在,我使用以下查詢讓所有Person都獲取其ID並獲取PersonEvent:

@Query("SELECT new domain.PersonEvent(ev.personId,ev.eventId,e.name,ev.state)" +
        " FROM EventVisitorEntity AS ev ,EventEntity AS e WHERE e.id = ev.eventId AND ev.personId IN (?1)")
List<PersonEvent> findEventsForPerson(List<Integer> ids);

可以編寫一個查詢來獲得帶有personEvents的人員。 在下面的構造函數中:

public PersonInfo(Person person, List<PersonEvent> personEvents)

幾乎沒有可能。 JPQL子查詢 ,這可能會幫助你勾勒personEvents ,只允許在wherehaving條款。

相反,我建議您按原樣接受查詢,並將收集的邏輯轉移到您的DAO層。 該鏈接可能會有所幫助: https : //dzone.com/articles/add-custom-functionality-to-a-spring-data-reposito 聲明一個方法List<PersonEvent> findEventsForPerson(List<Integer> ids) ,為其實現自定義存儲庫,在此執行所有必要的JPQL查詢和組合。 但是要當心N + 1問題。

同樣在這樣的定制實現中使用實體圖可能是方便的。

編輯:重新閱讀規范后,我意識到我誤以為在WHERE / HAVING子句中允許子查詢。 它說可以在這里使用,但並不排除相反的情況。 無論如何,即使有可能,這種方法(通過子查詢提取關系)很可能會導致N + 1問題,除非JPA實現者足夠聰明地預測到這一點(無論如何我都不會指望)。

暫無
暫無

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

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