hibernate中重複顯示問題的解決方法

下面是在hibernate中解決重複記錄顯示的一些思考
1.criterion.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)可以部分解決這個這問題,若結果需要分頁顯示這就無能爲力了,因爲這在內存中過濾重複的顯示,分頁顯示結果總數就不準確了。
2.criteria.setProjection(Projections.distinct(Projections.id()))只能指定某一個字段爲distinct,無法指定過濾某個對象
3.簡單的hql也只能指定單個字段爲distinct,無法指定某個對象爲distinct
4.只能通過子查詢來解決這個問題,hql語句的子查詢的示例如下:
  from User u where u.id in (select u2.id from User u2, UserGroup ug where u2.group=ug and ug.name=?) order by u.name asc
5.因爲我一直傾向於使用criterion來解決查詢問題,而且criterion也提供支持子查詢的Subqueries類,沒想到在使用Subqueries的時候遇到了莫名奇妙的bug,在子查詢語句中無法關聯對象,
  比如上面的hql語句中,在使用criterion的時候,就會丟掉UserGroup對象
  示例代碼:
  DetachedCriteria subquery = DetachedCriteria.forClass(User.class);
  subquery.setProjection(Projections.property("id"));
  subquery.createCriteria("UserGroup").add(Restrictions.eq("name", groupName));
 
  DetachedCriteria criteria = DetachedCriteria.forClass(User.class);
  criteria.add(Subqueries.propertyIn("id", subquery))
  getHibernateTemplate().findByCriteria(criteria);
  上面的criterion語句在執行的時候,解析出的sql語句就會把UserGroup對應的T_UserGroup表丟掉,但是T_UserGroup.name的查詢條件沒丟,當然這樣可定要報錯的,不知道什麼原因?

6.在http://opensource.atlassian.com/projects/hibernate/browse/HB-520有一些討論,雖然是討論hibrenate2的版本,但還是值得一看的
7.在http://www.jroller.com/page/RickHigh?entry=hibernate_query_getting_rid_of上也有一些值得一看的東西
 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章