我有一个实体Dog,然后是一个狗参与的事件实体。我想提取一个列表(字符串)的每个事件,有一个相应的DogId。我之所以使用JPA投影,是因为我需要实体的一个子集加上eventId。
public class DogSubset {
private String dogId;
private String dogName;
private Date birthDate;
private List<String> eventId
}
@Query("SELECT new project.entity.DogSubset(d.dogId, d.dogName, d.birthDate, e.eventId) FROM Dog d JOIN Event e on d.dogId = e.dogId WHERE d.dogId = :dogId")
public List<DogSubset> getDogSubSetsByDogId(String dogId);
接下来,基于another answer here,我尝试连接e.EventId并提取为集合,但它不起作用。
@Query("SELECT new project.entity.DogSubset(d.dogId, d.dogName, d.birthDate, x) FROM Dog d JOIN Event e on d.dogId = e.dogId JOIN FETCH e.eventId x WHERE d.dogId = :dogId")
public List<DogSubset> getDogSubSetsByDogId(String dogId);
经过更多的研究,我不确定我试图做的是可能的,有没有一种方法可以返回字符串列表而不需要单独的查询?
1条答案
按热度按时间hpcdzsge1#
如果你试图获取使用其中的List eventId构建的DogSubset示例-不,你不能。JPA及其查询语言不支持聚合到列表中。你可以选择接受dogId、dogName、birthDate、String eventId,把它们放在一个dogEvent中(或者只是处理一个tuple或Object[] result),然后自己把它们聚合到DogSubset示例中。
或者,您可以创建一个DogSubset视图“实体”,并将其Map到Dog表,其中Event.eventIdMap为@ElementCollection。举例来说:
只是要确保你永远不要尝试创建新的示例或更新它们,因为这会弄乱你的Dog和Event实体数据。