【问题标题】:sorting a collection in hibernate with an object value which could be null使用可能为空的对象值在休眠中对集合进行排序
【发布时间】:2014-09-24 05:37:43
【问题描述】:

我有一个这样的休眠类:

public class UserActivityLog implements java.io.Serializable {

private static final long serialVersionUID = 1L;
private Integer id;
private Users users;
private Servers servers;
private Date time;
private String event;
}

我使用休眠排序对一组 UserActivityLog 对象进行排序。这是我的休眠标准:

    criteria.add(Restrictions.ge(sortField, new Timestamp(startDate.getTime())));
    //add one day to the real end date for it to be considered in criteria
    Date eDate = getEndDate(endDate);
    criteria.add(Restrictions.le(sortField, new Timestamp(eDate.getTime())));
    if (searchByUser >= 0) {
        criteria.add(Restrictions.eq("users.id", searchByUser));
    }
    if (searchByHostId >= 0) {
        criteria.add(Restrictions.eq("servers.id", searchByHostId));
    }
    if (!searchByEvent.isEmpty()) {
        criteria.add(Restrictions.like("event", searchByEvent, MatchMode.ANYWHERE));
    }


    if(sortColumn.equals("username")) {
        sortColumn = "users.username";
        criteria.createAlias("users", "users");
    }
    else if (sortColumn.equals("hostName")) {
        sortColumn = "servers.hostName";
        criteria.createAlias("servers", "servers");
    }
    //specify the sorting oder
    if(SortDirection.asc.equals(sortDirection)) {
        criteria.addOrder(Order.asc(sortColumn));
    } else {
        criteria.addOrder(Order.desc(sortColumn));
    }

    List<Object> allRows = (ArrayList<Object>) criteria.list();

UserActivityLog 的服务器属性可以为空。当集合有一个服务器为空的对象时,如果我使用作为 Servers 对象中的属性的 hostName 对集合进行排序,则排序后的集合不包含服务器 = null 的对象。有什么原因还是我做错了什么?

更新: 这是休眠查询:

select count(*) as y0_ from USER_ACTIVITY_LOG this_ inner join SERVERS servers1_ on    this_.HOST_ID=servers1_.ID 
where this_.TIME>='2014/9/16' and this_.TIME<='2014/9/25' order by servers1_.HOST_NAME asc

【问题讨论】:

    标签: java hibernate sorting collections


    【解决方案1】:

    我猜想servers = null的对象没有从数据库中获取,因为:

    if (searchByHostId >= 0) {
        criteria.add(Restrictions.eq("servers.id", searchByHostId));
    }
    

    不是因为排序。

    【讨论】:

    • 我不这么认为,因为我在排序的时候没有设置host Id的搜索条件。表示 if (searchByHostId >= 0) 条件不成立。
    • 另外,初始数据加载默认按时间对集合进行排序。这时,我可以看到空的服务器对象。即使我按另一列排序,它也在那里。只有按主机名排序时,才会出现问题。
    • 嗯,不是那种。排序不会从结果中删除任何记录。
    • 发布底层 SQL 查询...也许会有所帮助
    • 添加了休眠查询,同时我发现了问题。当您从外键属性排序时,休眠查询会创建外键表的内连接。因此你不会得到那个空记录。有没有办法用标准来解决这个问题,还是我必须执行 HQL?
    【解决方案2】:

    我找到了根本原因和解决方案: 当我检查与这种排序相对应的休眠查询时,它与 Servers 表有一个内部连接(查询显示在问题中)。当有 server = null 的日志条目时,连接失败,因此不显示该记录。

    我解决此问题的方法是强制对该排序列进行 LEFT JOIN:

        if (sortColumn.equals("hostName")) {
            sortColumn = "servers.hostName";
            criteria.createAlias("servers", "servers", JoinType.LEFT_OUTER_JOIN);
        }
    

    【讨论】:

      猜你喜欢
      • 2019-02-02
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多