【问题标题】:Return a set instead of list with hibernate Criteria使用休眠标准返回一个集合而不是列表
【发布时间】:2013-11-05 02:47:04
【问题描述】:
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); 

【问题讨论】:

标签: java database hibernate list set


【解决方案1】:

我认为不可能使用基于 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

【讨论】:

  • 我们是获取员工对象列表还是仅获取员工 ID?我尝试使用此代码,它只会返回 id 列表而不是对象列表。
【解决方案2】:

正如 cmets 和 javadoc 所建议的,您必须从 Criteria 返回一个 List。因此,您唯一的选择是事后删除唯一性。正如 KepaniHaole 所说,如果你想保持秩序,你应该使用LinkedHashSet

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多