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);
答案 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。