2013-10-25 55 views
6
criteria = createCriteria("employee"); 
criteria.add(Restrictions.eq("name", "John")); 
criteria.addOrder(Order.asc("city")); 
criteria.addOrder(Order.asc("state")); 
List result = criteria.list(); 

此語句返回一個Employee對象的列表。我怎樣才能讓它返回一個Employee對象的Set來代替重複的數據?返回一個集合而不是休眠列表條件

我明白我可以通過創建一個如下所示的返回列表來實現這一點,但然後我會失去列表的排序順序。我不想編寫代碼來排序集合。

Set<Employee> empSet = new HashSet<Employee>(result); 
+3

您是否嘗試過使用LinkedHashSet?這將保持秩序,我想。 – yamafontes

+2

也許應該有所幫助:[can-hibernate-return-a-collection-of-result-objects-other-than-a-list](http://stackoverflow.com/questions/416970/can-hibernate-return- a-collection-of-results-objects-other-a-list) – baltov

+0

你是在找這個嗎? http://stackoverflow.com/questions/10731723/how-to-add-distinct-in-hibernate-criteria – Taylor

回答

2

由於意見和建議javadoc,你必須從Criteria返回List。因此,您唯一的選擇是在事後刪除唯一身份。正如KepaniHaole所說,如果你想維持秩序,你應該使用LinkedHashSet

7

我不認爲有可能使用基於javadoc的Criteria返回Set。但是,如果您想刪除重複數據,爲什麼不將Projections.distinct(...)添加到您現有的Criteria中以刪除重複項?

http://docs.jboss.org/hibernate/envers/3.6/javadocs/org/hibernate/criterion/Projections.html

UPDATE

例如,如果你想申請的員工名字SELECT DISTINCT(或某些標識符(S)),以獲得獨特的員工列表,你可以這樣做像這樣: -

List result = session.createCriteria("employee") 
      .setProjection(Projections.distinct(Projections.property("name"))) 
      .add(Restrictions.eq("name", "John")) 
      .addOrder(Order.asc("city")) 
      .addOrder(Order.asc("state")) 
      .list(); 

這樣,你根本不用擔心使用Set