【发布时间】:2011-09-13 06:46:09
【问题描述】:
我将 QueryDSL 与 JPA 一起使用。
我想查询一个实体的一些属性,是这样的:
QPost post = QPost.post;
JPAQuery q = new JPAQuery(em);
List<Object[]> rows = q.from(post).where(...).list(post.id, post.name);
效果很好。
如果我想查询关系属性,例如帖子的cmets:
List<Set<Comment>> rows = q.from(post).where(...).list(post.comments);
也不错。
但是当我想同时查询关系和简单属性时,例如
List<Object[]> rows = q.from(post).where(...).list(post.id, post.name, post.comments);
然后出了点问题,生成了错误的 SQL 语法。
然后我意识到不可能在一个 SQL 语句中同时查询它们。
QueryDSL 是否有可能以某种方式处理关系并生成额外的查询(就像 hibernate 对惰性关系所做的那样),然后将结果加载进去?
还是应该只查询两次,然后合并两个结果列表?
附:我真正想要的是每个帖子都有其 cmets 的 ID。所以连接每个帖子的评论id的功能更好,这种表达可能吗?
q.list(post.id, post.name, post.comments.all().id.join())
并生成像(select group_concat(c.id) from comments as c inner join post where c.id = post.id)这样的子查询sql
【问题讨论】: