2015-09-17 2 views
0

Допустим, у нас есть много-ко-многим:JPA подзапрос, возвращающий список в конструктор

entity ChannelDO { 
    Long id; 
    String name; 
    Set<LanguageDO> languages; 
} 
entity LanguageDO { 
    Long id; 
    String name; 
} 

Тогда есть простой класс, используемый в REST связи между клиентом и сервером (по некоторым причинам я никогда не позволял моя сущность объекты идут внешние методы EJB):

public class ChannelListItem { 
    public Long id; 
    public String name; 
    public List<String> languages; 
    public ChannelListItem(); 
    public ChannelListItem(Long id, String name, List<String> languages); 
} 

объектов этого класса оказывается в табличные зрения на стороне клиента.

Я мог бы просто выбрать список объектов сущности и составить окончательный список ChannelListItems самостоятельно, но, возможно, есть удобный способ сделать JPA (Hibernate) сделать это.

Я пытаюсь с запросом, как это, но без успеха:

select new pkg.ChannelListItem(c.id, c.name, 
    (select cl.name from c.languages cl order by cl.name asc)) 
from ChannelDO c 
order by c.name asc 

кажется, что мой подзапрос только в состоянии вернуть одно значение. JPA говорит мне, что он ожидает конструктора с последним параметром типа String вместо List.

ответ

0

насчет

select new pkg.ChannelListItem(c.id, c.name, c.languages) 
from ChannelDO c 
order by c.name asc 

с DTO как

public class ChannelListItem { 
    public Long id; 
    public String name; 
    public List<String> languages; 
    public ChannelListItem(); 
    public ChannelListItem(Long id, String name, List<ChannelDO> channels){ 
     languages = new ArrayList<String>(); 
     for(ChannelDO channel: channels) 
      languages.add(channel.getName()) 
     //omitted 
    } 
} 

И отвечая на ваш вопрос: JPA не поддерживает подзапросы в выберите.

Смежные вопросы