【问题标题】:Sorting with SortableDataProvider and Hibernate使用 SortableDataProvider 和 Hibernate 进行排序
【发布时间】:2015-11-14 18:41:28
【问题描述】:

我有以下代码:

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;
}

}

可排序数据提供者

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);
}

我已经完成了分页没有问题,但我无法理解如何使用休眠进行排序,我可以看到你如何从 java 方面进行排序,但考虑到我可能会获得大型数据集,我不喜欢这个主意。

鉴于我上面的代码,是否有人可以通过单击名字或姓氏来获取数据表,然后使用附加的 order by 子句在迭代器中进行相同的查询。

【问题讨论】:

    标签: java hibernate sorting wicket


    【解决方案1】:

    你快到了。你只需要一个:

    addOrder(Order.asc(columnName))
    

    文档是here

    【讨论】:

    • 是的,我终于添加了这个,但是当我单击列标题更改顺序时,getSort().getProperty() 和 isAscending 值不会改变,有什么想法吗?
    • 我在PropertyColumns中添加了额外的排序参数以供参考。
    【解决方案2】:

    对于遇到这种情况的任何人,我都有以下设置:

    休眠 4、弹簧 4 和检票口 6

    我使用 Spring 注入,如果您在 SortableDataProvider 中注入,似乎检票口和弹簧会混淆。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-26
      • 2014-10-02
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多