java - 使用 hibernate 连接和分页复制记录

标签 java oracle hibernate

我正在使用 hibernate 3.6.3 Final 版本(我知道它很旧,但在我目前正在进行的这个项目中就是这样)。
我在执行连接和分页时遇到问题,以便在 hibernate 导致的结果中重复一条记录。
这是我的代码:

public Page<T> findByCriteriaPaginated(PageParams params, Criteria countCriteria, Criteria listCriteria, String[] joins) {
    Page<T> page = new Page<T>(params);
    // count criteria
    countCriteria.setProjection(Projections.rowCount());
    page.setTotalCount(((Long) countCriteria.uniqueResult()).intValue());
    // fetch criteria
    listCriteria.setFirstResult(params.getFirstResultIdx());
    listCriteria.setMaxResults(params.getPageSize());
    if (params.getOrdering() != null && params.getOrdering().getSize() > 0) {
        for (Iterator<String> it = params.getOrdering().getKeyIterator(); it.hasNext();) {
            String key = it.next();
            if (params.getOrdering().isAscending(key)) {
                listCriteria.addOrder(Order.asc(key));
            } else {
                listCriteria.addOrder(Order.desc(key));
            }
        }
    }
    if (joins != null && joins.length > 0) {
        for (String s : joins) {
            listCriteria.setFetchMode(s, FetchMode.JOIN);
        }
    }
    page.setResults(listCriteria.list());
    return page;
}

当我点击生成的查询并在数据库服务器上运行它时,我没有这条重复记录。但是调试我的代码时,listCriteria.list() 返回了重复的数据集。另外,当我注释掉这两行 listCriteria.setFirstResult(params.getFirstResultIdx()); listCriteria.setMaxResults(params.getPageSize());,那么listCriteria.list()没有重复,就可以了。
所以,这向我表明,分页和其他标准(连接和排序)存在一些问题。
有人知道如何解决这个问题吗?这是 hibernate 错误吗?将 hibernate 版本增加到最新版本(5.2.9.Final)会有帮助吗?这么大的版本升级有什么潜在问题吗?
感谢您提供任何帮助。

错误

最佳答案

两件事:

  • 如果您在同一页中看到重复的行,则说明您的联接有问题。尝试记录 SQL 查询,然后手动执行。解决此问题的最佳方法是使用 criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
  • 对于您的分页,如果 getOrdering() 为空,则您不添加任何 order by。虽然,要正确分页,您绝对需要一个 order by 子句。将 listCriteria.addOrder(Order.asc("id")); 添加到您的代码中,以便 Id 成为最后的订购手段。

关于java - 使用 hibernate 连接和分页复制记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42910271/

相关文章:

oracle - 立即执行多个更新

java - 更改一对多映射中外键的默认名称 : HIBERNATE

java - HQL 按条件排序

java - 在循环中添加到集合中的对象何时会被垃圾收集?

sql - 在 oracle 数据库语句中使用 ENABLE 关键字的原因/用处是什么

java - 如何使用 JNLP 文件包含依赖项 jar?

sql - 对象变化时是否需要重新创建Oracle同义词?

Java hibernate/C3P0 错误 : "Could not obtain connection metadata. An attempt by a client to checkout a Connection has timed out."

java - 给出inode信息,我们如何在Java中获取文件路径?

java - java中读取多个项目时如何忽略逗号后的空格