2014-09-24 2 views
0

У меня есть класс спящего режима, как это:сортировка коллекции в спящем режиме со значением объекта, который может быть нулевым

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 может быть пустым. Когда у коллекции есть объект с серверами null, и если я сортирую коллекцию с использованием hostName, которая является свойством в объекте Servers, сортированная коллекция не содержит этот объект с серверами = null. Есть ли причина для этого или я делаю что-то неправильно?

Update: Вот зимуют запрос:

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

Я нашел как основную причину, так и решение: Когда я проверяю запрос на спящий режим, соответствующий этому типу, он имеет внутреннее соединение с таблицей серверов (запрос указан в вопросе). Когда есть запись в журнале с сервером = null, соединение не выполняется, поэтому запись не отображается.

Что я сделал, чтобы исправить эту проблему, чтобы заставить LEFT JOIN для этого столбца сортировки:

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

Я бы предположил, что объекты с серверами = нуль не был выбираемые из базы данных из-за:

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

Не из-за вид.

+0

Я не думаю, что это так, потому что я не установил критерии поиска Id хоста при сортировке. Означает, что если условие (searchByHostId> = 0) было неверным. – devC

+0

Кроме того, начальная загрузка данных сортирует коллекцию по времени по умолчанию. В это время я вижу пустой объект сервера. Даже когда я сортирую по другому столбцу, он есть. Проблема возникает только при сортировке по имени хоста. – devC

+0

Ну, это не сорт. Сортировка не удаляет запись из результата. – DiogoSantana