创建回复表结构如下:
jpa+springboot,查询每个评论的回复代码如下:
@Override
public List<Reply> queryList(ReplyQueryRequest parameter) {
List<Reply> list1 = replyRepository.findList(parameter);
List<Reply> list2 = new ArrayList<>();
for (Reply reply : list1){
List<Reply> list3 = new ArrayList<>();
if (null == reply.getReply()){
if (null == parameter.getAuditStatus()) {
list3 = replyRepository.findByReplyIdAndDeletedOrderByReleaseTimeAsc(reply.getId(), false);
} else {
list3 = replyRepository.findByReplyIdAndAuditStatusAndDeletedOrderByReleaseTimeAsc(reply.getId(), parameter.getAuditStatus(), false);
}
list2.add(reply);
Boolean flag = true;
while (flag){
List<Reply> list4 = new ArrayList<>();
for (Reply reply1 : list3){
List<Reply> list5 = new ArrayList<>();
if (null == parameter.getAuditStatus()) {
list5 = replyRepository.findByReplyIdAndDeletedOrderByReleaseTimeAsc(reply1.getId(), false);
} else {
list5 = replyRepository.findByReplyIdAndAuditStatusAndDeletedOrderByReleaseTimeAsc(reply1.getId(), parameter.getAuditStatus(), false);
}
list2.add(reply1);
if(list5.size()>0){
list4.addAll(list5);
}
}
if (list4.size()>0){
list3.clear();
list3.addAll(list4);
}else {
flag=false;
}
}
}
}
return list2;
}
这是findList()方法实现代码:
public class ReplyRepositoryImpl extends AbstractCustomRepositoryImpl implements ReplyRepositoryCustom {
@Override
public List<Reply> findList(ReplyQueryRequest parameter) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Reply> query = cb.createQuery(Reply.class);
Root<Reply> mappingRoot = query.from(Reply.class);
query.select(mappingRoot);
List<Predicate> predicates = new ArrayList<Predicate>();
predicates.add(cb.equal(mappingRoot.get("deleted"), false));
if (!StringUtils.isEmpty(parameter.getAuditStatus())) {
predicates.add(cb.equal(mappingRoot.get("auditStatus"), parameter.getAuditStatus()));
}
if (CheckUtils.available(parameter.getCommentsId())) {
Comments comments = new Comments();
comments.setId(parameter.getCommentsId());
predicates.add(cb.equal(mappingRoot.get("comments"), parameter.getCommentsId()));
}
if (CheckUtils.available(parameter.getReplyId())) {
Reply reply = new Reply();
reply.setId(parameter.getReplyId());
predicates.add(cb.equal(mappingRoot.get("reply"), parameter.getReplyId()));
}
if (CheckUtils.available(parameter.getTopicUserId())) {
AppUser appUser = new AppUser();
appUser.setId(parameter.getTopicUserId());
predicates.add(cb.equal(mappingRoot.get("topicUser"), parameter.getTopicUserId()));
}
List<Order> orderList = new ArrayList();
orderList.add(cb.asc(mappingRoot.get("releaseTime")));
query.orderBy(orderList);
query.where(predicates.toArray(new Predicate[]{}));
TypedQuery<Reply> typedQuery = entityManager.createQuery(query);
return typedQuery.getResultList();
}
}
但是获取的回复内容是是分级的,比如1级下面如果有两个2级回复,那么就会先将2级回复放到1级下面后,在根据2级查询是否有3级的回复。