QueryDSL:查询关系和属性

Vis*_*hao 2 jpa querydsl

我正在使用带有JPA的QueryDSL.

我想查询一个实体的一些属性,它是这样的:

QPost post = QPost.post;
JPAQuery q = new JPAQuery(em);
List<Object[]> rows = q.from(post).where(...).list(post.id, post.name);
Run Code Online (Sandbox Code Playgroud)

它工作正常.

如果我想查询关系属性,例如帖子的评论:

List<Set<Comment>> rows = q.from(post).where(...).list(post.comments);
Run Code Online (Sandbox Code Playgroud)

这也没关系.

但是,当我想要一起查询关系和简单属性时,例如

List<Object[]> rows = q.from(post).where(...).list(post.id, post.name, post.comments);
Run Code Online (Sandbox Code Playgroud)

然后出了点问题,产生了错误的SQL语法.

然后我意识到在一个SQL语句中不可能一起查询它们.

QueryDSL是否有可能以某种方式处理关系并生成其他查询(就像hibernate对惰性关系所做的那样),并加载结果?

或者我应该只查询两次,然后合并两个结果列表?

PS我真正想要的是每个帖子及其评论'ID.因此,连接每个帖子的评论ID的功能更好,这种表达是否可能?

q.list(post.id, post.name, post.comments.all().id.join())
Run Code Online (Sandbox Code Playgroud)

并生成一个子查询sql (select group_concat(c.id) from comments as c inner join post where c.id = post.id)

Tim*_*per 5

Querydsl JPA仅限于JPQL的表现力,因此Querydsl JPA无法满足您的要求.您可以尝试使用Querydsl SQL表达它.它应该是可能的.另外,因为你没有项目实体,但文字和集合它可能工作得很好.

或者,您可以仅加载注释ID来加载帖子,然后将id,name和comment id投影到其他内容.这在访问者注释时应该有效.