JPA子查询将列表返回到构造函数中

时间:2015-09-17 13:30:58

标签: java hibernate 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。

1 个答案:

答案 0 :(得分: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在select中不支持子查询。