spring-data-jpa 正确使用单个@ManyToOne关联进行大小控制和分页

jei2mxaa  于 2022-11-10  发布在  Spring
关注(0)|答案(2)|浏览(165)

我想避免“双向@OneToMany“关联,原因如下:
1.它不能限制@OneToMany的大小
1.我需要做分页。
为此,我使用了this tutorial,它描述了“Just @ManyToOne“关联,但不幸的是,它只给出了一行与此相关的代码:

List<PostComment> comments = entityManager.createQuery(
    "select pc " +
    "from PostComment pc " +
    "where pc.post.id = :postId", PostComment.class)
.setParameter( "postId", 1L )
.getResultList();

所以,我有许多疑问:
1.我应该在哪里使用这条线?
1.我应该如何以及在哪里获得EntityManager?确切地说是在实体中?这是一个好的解决方案吗?
1.我如何避免使用EntityManager?我已经看过this和其他问题,但不幸的是,它们对我没有帮助。
1.我有Post作为父实体,Comment作为子实体。一个帖子可以有很多评论。代码:
如果我在Comment中使用此函数:

@ManyToOne(fetch = FetchType.LAZY)   
@JoinColumn(name = "post_id")  
private Post post;

Post中:

private Set<Comment> comments;

所以,我删除了@OneToMany作为上述教程说,我得到:

MappingException: Could not determine type for: java.util.List, at table: post, for columns: [org.hibernate.mapping.Column(comments)]

那么,如何使用“Just @ManyToOne“关联(或其他方便的关联)来控制comments的大小和分页呢?

1tu0hz3e

1tu0hz3e1#

我找到了不完美,但对我来说最正确的解决办法。
职务:

@Entity(name = "Post")
public class Post {

    //...
    @Transient
    private List<PostComment> comments;

    public void addComment(PostComment comment) {
        comments.add(comment);
        comment.setPost(this);
    }

    public void removeComment(PostComment comment) {
        comments.remove(comment);
        comment.setPost(null);
    }

    public void clearComments(){
        comments.clear();
    }

    public List<PostComment> getComments() {
        return comments;
    }

    public void setComments(List<PostComment> comments) {
        this.comments = comments;
    }
}

发表评论:

@Entity(name = "PostComment")
public class PostComment {

    //...

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "post_id")
    private Post post;

    public Post getPost() {
        return post;
    }

    public void setPost(Post post) {
        this.post = post;
    }
}

后期注解服务实现:

@Service
public class PostCommentServiceImpl {

    @Autowired
    private PostCommentRepository repository;

    //...

    public void setCommentsInPost(Post post, int first, int size){
        Pageable pageRequest = new PageRequest(first, size);

        Page<PostComment> pageOfPostComment = repository.findByPostId(post.getId(), pageRequest);

        post.setComments(pageOfPostComment.getContent());
    }
}

控制器:

@Controller
public class PostController {
    @Autowired
    private PostCommentService postCommentService;

    @Autowired
    private PostService postService;

    //...
    @RequestMapping(value = "/something", method = RequestMethod.GET)
    public void foo() {
        Post post = postService.findById(1L);

        postCommentService.setCommentsInPost(post,0,10);

        //...
    }
    //...
}
mjqavswn

mjqavswn2#

您可以通过使用Spring dataJpaRepository来避免使用EntityManager。JpaRepository附带了内置的方法Page<T> findAll(Pageable pageable),您可以使用该方法进行分页。您可以阅读以下文章来开始使用:https://www.baeldung.com/spring-data-repositories
祝你好运!
编辑:另外,关于第4点:

@ManyToOne(fetch = FetchType.LAZY)   
@JoinColumn(name = "post_id")  
private Post post;

这里你基本上是说一个评论可以有很多帖子,而不是相反(一个帖子可以有很多评论)。

相关问题