繁体   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