2013-10-25 50 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