2013-10-25 7 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オブジェクトのリストを返します。重複したデータを削除するには、従業員オブジェクトの代わりにSetを返すようにするにはどうすればよいですか?休止状態のリストの代わりにセットを返します。基準

私は、以下のように返されたリストのセットを作成することでこれを実現できますが、リストのソート順を失うことは理解しています。そして、私はセットをソートするコードを書く必要はありません。コメントやjavadocとして

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

あなたは 'LinkedHashSet'を使ってみましたか?それは注文を保存すると思います。 – yamafontes

+2

多分それは助けてくれるはずです:[can-hibernate-return-a-result-objects-of-a-list](http://stackoverflow.com/questions/416970/can-hibernate-return-結果収集オブジェクトのリスト以外のもの) – baltov

+0

あなたはこれをお探しですか? http://stackoverflow.com/questions/10731723/how-to-add-distinct-in-hibernate-criteria – Taylor

答えて

2

、あなたがCriteriaからListを返す必要が示唆されました。したがって、唯一の選択肢は、事後にユニークを削除することです。 KepaniHaoleが言ったように、注文を保存したい場合はLinkedHashSetを使用してください。

7

javadocに基づいてCriteriaを使用してSetを返すことはできません。ただし、重複したデータを削除する場合は、既存のCriteriaProjections.distinct(...)を追加して重複を削除してください。あなたはユニークな従業員のリストを取得するために、従業員名のSELECT DISTINCT(またはいくつかの識別子(複数可))を適用する場合たとえば、あなたが何かを行うことができます

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

UPDATEこのように: -

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を使用して心配する必要はありません。