使用投影在JPA @Query中返回字符串列表

xvw2m8pv  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(102)

我有一个实体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);

经过更多的研究,我不确定我试图做的是可能的,有没有一种方法可以返回字符串列表而不需要单独的查询?

hpcdzsge

hpcdzsge1#

如果你试图获取使用其中的List eventId构建的DogSubset示例-不,你不能。JPA及其查询语言不支持聚合到列表中。你可以选择接受dogId、dogName、birthDate、String eventId,把它们放在一个dogEvent中(或者只是处理一个tuple或Object[] result),然后自己把它们聚合到DogSubset示例中。
或者,您可以创建一个DogSubset视图“实体”,并将其Map到Dog表,其中Event.eventIdMap为@ElementCollection。举例来说:

@Entity
@Table(name = "dog_table")
public class DogSubset {
  @Id
  private String dogId;
  private String dogName;
  private Date birthDate;
  @ElementCollection 
  @CollectionTable(name = "event_table", joinColumns = @JoinColumn(name = "dogId"))
  private List<String> eventId
}

只是要确保你永远不要尝试创建新的示例或更新它们,因为这会弄乱你的Dog和Event实体数据。

相关问题