使用hibernate Criteria返回set而不是list

时间:2013-10-25 20:39:59

标签: java database hibernate list set

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个Employee对象,以删除重复数据?

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

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

2 个答案:

答案 0 :(得分:8)

我认为不可能使用Set基于javadoc返回Criteria。但是,如果您要删除重复数据,为什么不向现有Projections.distinct(...)添加Criteria以删除重复数据?

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

<强>更新

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

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

答案 1 :(得分:2)

根据评论和javadoc建议,您必须从Criteria返回List。因此,您唯一的选择是在事后删除唯一身份。正如KepaniHaole所说,如果你想保留秩序,你应该使用LinkedHashSet