让我们说我们有多对多的关系:
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 :(得分: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中不支持子查询。