QueryDsl和集

时间:2016-02-15 08:49:59

标签: querydsl

我有3个实体(用户,帖子,评论):

@Entity
public class User {
    @Id  private Long id;
    @OneToMany private Set<Post> posts;
    ...
}

@Entity
public class Post {
    @Id  private Long id;
    @ManyToOne private User user;
    @OneToMany private Set<Comment> comments;
    ...
}

@Entity
public class Comment {
    @Id  private Long id;
    @ManyToOne private Post post;
    ...
}

现在我只能选择有帖子的用户:

List<User> users = query.from(qUser)
    .leftJoin(qUser.posts, qPost)
    .transform(groupBy(qUser.id).list(
        Projections.bean(User.class, qUser.id, ..., set(
            Projections.bean(Post.class, qPost.id, ...)
        ).as(qUser.posts))
    ));

但我需要在一个查询中选择包含帖子和评论的用户,例如:

List<User> users = query.from(qUser)
    .leftJoin(qUser.posts, qPost)
    .leftJoin(qPost.comments, qComment)
    .transform(groupBy(qUser.id).list(
        Projections.bean(User.class, qUser.id, ..., set(
            Projections.bean(Post.class, qPost.id, ...,
               set(Comment.class, qComment.id, ...).as(qPost,comments)
            )
        ).as(qUser.posts))
    ));

我该怎么做?

1 个答案:

答案 0 :(得分:1)

您的评论需要第三次投影。

List<User> users = query.from(qUser)
    .leftJoin(qUser.posts, qPost)
    .leftJoin(qPost.comments, qComment)
    .transform(groupBy(qUser.id).list(
        Projections.bean(User.class, qUser.id, ..., 
            set(Projections.bean(Post.class, qPost.id, ...,
               set(Projections.bean(Comment.class, qComment.id, ...).as("comments")
            ).as("posts")
        )
    );