2014-09-24 64 views
0

我有一個休眠類是這樣的:排序在Hibernate與對象值的集合可能是空

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對象的集合,使用Hibernate的排序。這裏是我的休眠標準:

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屬性可以爲null。當集合有一個服務器爲空的對象時,並且如果使用作爲Servers對象屬性的hostName對集合進行排序,那麼排序的集合不包含具有servers = null的對象。是否有任何理由或我做錯了什麼?

更新: 這裏是Hibernate查詢:

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 

回答

0

我找到了根本原因和解決方案: 當我檢查對應於此排序的hibernate查詢時,它與Servers表(查詢顯示在問題中)有一個內部聯接。當有一個服務器= null的日誌條目時,加入失敗,因此該記錄不顯示。

我做了什麼來解決這個問題是強制LEFT JOIN爲排序列:

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

我猜想,與服務器= NULL不從,因爲數據庫中獲取的對象:

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

不是因爲這種排序。

+0

我不這麼認爲,因爲我沒有排序時爲主機ID設置搜索條件。意思是if(searchByHostId> = 0)條件不成立。 – devC 2014-09-24 05:50:34

+0

另外,默認情況下,初始數據加載按時間對收集進行排序。此時,我可以看到空的服務器對象。即使我按另一列排序它在那裏。只有在按主機名排序時,纔會出現問題。 – devC 2014-09-24 05:52:03

+0

恩,這不是那種。排序不會從結果中刪除任何記錄。 – DiogoSantana 2014-09-24 05:52:32