使用Hibernate Criteria返回一个集合而不是列表

8
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,但是这样会失去列表的排序顺序。而且我不想编写代码来对 set 进行排序。

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

3
你试过使用LinkedHashSet吗?它可以保留顺序,我认为这可能会有帮助。 - yamafontes
你在寻找这个吗?https://dev59.com/x2gv5IYBdhLWcg3wQ-kV - Taylor
2个回答

8
根据javadoc,使用Criteria无法返回Set。但是,如果您想要删除重复数据,为什么不在现有的Criteria中添加Projections.distinct(...)以删除重复项?请参考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
我们能得到员工对象列表还是只有员工ID?我尝试使用这段代码,但它只会返回ID列表而不是对象列表。 - MR AND

3
根据评论和 javadoc 的建议,你需要从 Criteria 返回一个 List。因此,你唯一的选择是在操作后删除重复项。正如 KepaniHaole 所说,如果要保留顺序,应该使用 LinkedHashSet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接