Spring+Hibrenate中findByCriteria(criteria, start, limit)查询重复的问题解决

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:28   922   0

1、问题出现的场景:两个Entity互相关联,我这里有两个类MessageMedel和CaseProcess,代码如下:

MessageModel类:

public class MessageModel extends Model {
 @Id
 @GeneratedValue
 @OrderBy("id")
 private long id;

 @ManyToMany(fetch = FetchType.EAGER)
 private List<Dict> recivers = new ArrayList<Dict>();

 @ManyToOne
 private Dict messageType;

 // 关联多个CaseProcess对象
 @OneToMany(cascade = CascadeType.ALL)
 private List<CaseProcess> caseProcessList;

}


CaseProcess类:

@Entity
public class CaseProcess extends Model {

 @Id
 @GeneratedValue
 private long id;

 @ManyToOne
 private Dict timerType;
 @ManyToOne
 private Dict caseGrade;
 @ManyToOne
 private Dict caseStatus;

 // 关联一个MessageModel对象
 @ManyToOne
 private MessageModel messageModel;

}
其中MessageModel中caseProcessList关联多个CaseProcess,CaseProcess中关联一个MessageModel,当使用hibernateTemplate.findByCriteria(criteria, start, limit);分页查询时,会发生数据重复的现象。该方法参数中criteria是由以下方法获得的:

protected DetachedCriteria getConditions(String query,
   Map<String, String> queryMap) {
  return DetachedCriteria.forClass(this.entityClass);
}
问题就出在了return DetachedCriteria.forClass(this.entityClass);一句,如果是在MessageModelService中,该句在查询MessageModel(记为m1)时,会级联查询CaseProcess,而CaseProcess中又关联着一个MessageModel(记为m2),如果m1和m2在数据库中是同一条数据,则在hibernateTemplate.findByCriteria(criteria, start, limit);执行后,发生重复,解决办法是:

在MessageModelService中getConditions方法改写为:

@Override
 protected DetachedCriteria getConditions(String query,
   Map<String, String> queryMap) {
  DetachedCriteria detachedCriteria = super
    .getConditions(query, queryMap);
  detachedCriteria.setFetchMode("caseProcessList", FetchMode.SELECT);
  return detachedCriteria;
 }

在CaseProcess中getConditions改写为:

@Override
 protected DetachedCriteria getConditions(String query,
   Map<String, String> queryMap) {
  DetachedCriteria detachedCriteria = super
    .getConditions(query, queryMap);
  detachedCriteria.setFetchMode("messageModel", FetchMode.SELECT);
  return detachedCriteria;
 }

问题解决,这里特别感谢 http://blog.sina.com.cn/s/blog_6af9cfe80101277m.html这篇文章的作者!

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP