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