7
criteria = createCriteria("employee");  
criteria.add(Restrictions.eq("name", "John"));  
criteria.addOrder(Order.asc("city"));
criteria.addOrder(Order.asc("state"));
List result = criteria.list();

此语句返回Employee对象列表。我怎样才能让它返回一个SetEmployee 对象,以删除重复数据?

我知道我可以通过从返回的列表中创建一个集合来实现这一点,如下所示,但是我会丢失列表的排序顺序。而且我不想编写代码来对集合进行排序。

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

2 回答 2

8

我认为不可能返回基于 javadoc的Setusing 。Criteria但是,如果您想删除重复数据,为什么不在Projections.distinct(...)现有数据中添加一个来删除重复数据Criteria呢?

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

更新

例如,如果您想SELECT DISTINCT在员工姓名(或某些标识符)上应用 a 以获取唯一员工列表,您可以执行以下操作:-

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

于 2013-10-25T20:51:29.310 回答
3

正如评论和javadocList建议的那样,您必须从Criteria返回 a 。因此,您唯一的选择是事后删除唯一性。正如 KepaniHaole 所说,如果你想保持顺序 ,你应该使用LinkedHashSet 。

于 2013-10-25T20:46:03.697 回答