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

来源:互联网 发布:淘宝新开店铺有扶持吗 编辑:程序博客网 时间:2024/05/29 09:16

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>();@ManyToOneprivate Dict messageType;// 关联多个CaseProcess对象@OneToMany(cascade = CascadeType.ALL)private List<CaseProcess> caseProcessList;}


CaseProcess类:

@Entitypublic class CaseProcess extends Model {@Id@GeneratedValueprivate long id;@ManyToOneprivate Dict timerType;@ManyToOneprivate Dict caseGrade;@ManyToOneprivate Dict caseStatus;// 关联一个MessageModel对象@ManyToOneprivate 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方法改写为:

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

在CaseProcess中getConditions改写为:

@Overrideprotected 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这篇文章的作者!

原创粉丝点击