2015-07-19 46 views
0

我有以下代码:与SortableDataProvider排序和Hibernate

PersonDao.java

@Repository 
@Transactional 
public class PersonDao implements PersonDaoIface { 

Object property; 
String order; 

@Autowired 
private SessionFactory sessionFactory; 

public PersonDao() { 

} 

public PersonDao(SessionFactory sessionFactory) { 
    this.sessionFactory = sessionFactory; 
} 

@SuppressWarnings("unchecked") 
@Override 
public List<Person> getAll(long first, long count) { 
    Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Person.class); 
    this.setPaging(criteria, first, count); 
    addSort(criteria); 
    return criteria.list(); 
} 

@Override 
public long getAllCount() { 
    Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Person.class) 
      .setProjection(Projections.rowCount()); 
    Long i = (Long) criteria.uniqueResult(); 
    return i; 
} 

@Override 
public List<Person> getByFilter(Person person, int first, int count) { 
    Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Person.class); 
    criteria.add(Restrictions.eq("firstName", person.getFirstName())); 
    criteria.add(Restrictions.eq("lastName", person.getLastName())); 
    this.setPaging(criteria, first, count); 
    return criteria.list(); 
} 

@Override 
public long getByFilterCount(Person person) { 
    Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Person.class); 
    criteria.add(Restrictions.eq("firstName", person.getFirstName())); 
    criteria.add(Restrictions.eq("lastName", person.getLastName())); 
    criteria.setProjection(Projections.rowCount()); 
    Long result = (Long) criteria.uniqueResult(); 
    return result; 
} 

private void setPaging(Criteria criteria, long first, long count) { 
    criteria.setFirstResult((int) first); 
    criteria.setMaxResults((int) count); 
} 

private void addSort(Criteria criteria) { 
    if (property != null) { 
     if (order.equalsIgnoreCase(SortOrder.ASCENDING.toString())) { 
      criteria.addOrder(Order.asc((String)property)); 
     } else { 
      criteria.addOrder(Order.desc((String)property)); 
     } 
    } 
} 

@Override 
public void setSort(Object property, String order) { 
    this.property = property; 
    this.order = order; 
} 

}

SortableDataProvider

public class PersonSortableDataProvider extends SortableDataProvider { 

private transient PersonDaoIface personDao; 

public PersonSortableDataProvider(PersonDaoIface personDao) { 
    this.personDao = personDao; 

} 

public PersonSortableDataProvider() { 
} 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

@Override 
public Iterator<Person> iterator(long first, long count) { 
    System.out.println(getSort()); 
    return personDao.getAll(first, count).iterator(); 
} 

@Override 
public long size() { 
    long result = personDao.getAllCount(); 
    return result; 
} 

@Override 
public IModel<Person> model(final Object object) { 
    return new AbstractReadOnlyModel<Person>() { 
     @Override 
     public Person getObject() { 
      return (Person) object; 
     } 
    }; 
} 

}

用的面板使用排序数据提供的数据表

public DataDisplayPanel(String id) { 
    super(id); 

    List<IColumn> columns = new ArrayList<IColumn>(); 
    columns.add(new PropertyColumn(new Model<String>("First Name"), "firstName")); 
    columns.add(new PropertyColumn(new Model<String>("Last Name"), "lastName")); 

    AjaxFallbackDefaultDataTable table = new AjaxFallbackDefaultDataTable("personData", columns, 
      personSortableDataProvider, 8); 
    table.addTopToolbar(new HeadersToolbar(table, personSortableDataProvider)); 
    add(table); 
} 

我已经分页做没有问题,但我无法理解如何获得排序使用Hibernate,我可以看到你怎么可以从事物的Java方面的排序,但考虑到我可能会获得大量的数据集,我不喜欢这个想法。

鉴于我上面的代码是否有人有办法获取数据表,单击名或姓,然后使用附加的order by子句在迭代器中找到相同的查询。

回答

0

你几乎在那里。您只需要一个:

addOrder(Order.asc(columnName)) 

该文档是here

+0

是的,我终于添加了这个,但是当我点击列标题来改变顺序getSort()。getProperty()和isAscending值不会改变,任何想法? – user1383163

+0

我已经在PropertyColumns中添加了用于排序的额外参数以供参考。 – user1383163

0

给任何人遇到这种情况时,我有以下设置:

冬眠4,弹簧4和检票口6

我注入使用Spring,它似乎检票和春季会感到困惑,如果你的SortableDataProvider内注入。

我不知道究竟发生了什么;当我跨过这个项目时,我会有一个更好的主意,但是看起来setSort没有正确设置,当我将Dao类从可排序数据提供者移出并进入页面并将其注入到那里时,然后将dao实例传递给可排序数据正确提供分类工作。