[英]Spring Data JPA JPQL list in constructor
在我的應用程序中(一種非標准情況),我在mysql中有一個實體層,在控制器中有一個dominain層。 我的域模型包含一些實體,可以將其集成到一個JPQL查詢中嗎?
實體層:
PersonEntity表
EventEntity表
EventVisitorEntity表
PersonEntity多對多EventEntity
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
,只允許在where
和having
條款。
相反,我建議您按原樣接受查詢,並將收集的邏輯轉移到您的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.