我将 QueryDSL 与 JPA 一起使用。
我想查询一个实体的一些属性,是这样的:
QPost post = QPost.post;
JPAQuery q = new JPAQuery(em);
List<Object[]> rows = q.from(post).where(...).list(post.id, post.name);
它工作正常。
如果我想查询关系属性,例如帖子的评论:
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 对惰性关系所做的那样)并加载结果?
或者我应该只查询两次,然后合并两个结果列表?
PS我真正想要的是每个帖子都有评论的ID。所以连接每个帖子的评论ID的功能更好,这种表达可能吗?
q.list(post.id, post.name, post.comments.all().id.join())
并生成一个子查询sql(select group_concat(c.id) from comments as c inner join post where c.id = post.id)