【问题标题】:Hibernate : Criteria ignoring fetchSize parameter and fetching more rows than askedHibernate:条件忽略 fetchSize 参数并获取比要求更多的行
【发布时间】:2016-09-09 09:56:39
【问题描述】:

我正在开发一个 Spring-MVC 应用程序,其中我有一个使用 Criteria 编写的搜索功能。对于分页搜索,我从前端获取 firstResult 和 fetchSize 作为参数。不幸的是,当仅询问 20 行时,Criteria 忽略了它们并返回了一个巨大的列表(大约 1000 行)。出了什么问题?

代码:

  System.out.println("Fetch size is "+fetchSize);
        System.out.println("First result is "+firstResult);
Criteria andCriteria = session.createCriteria(Host.class);
            Conjunction and = Restrictions.conjunction();
            if((studentSearchHistory.getCity()!=null) && (!(studentSearchHistory.getCity().isEmpty()))) {
                and.add(Restrictions.ilike("city", studentSearchHistory.getCity()));
            }
//Other search conditions
    andCriteria.setFetchSize(fetchSize);
    andCriteria.setFirstResult(firstResult);
    andCriteria.add(and);
    hostList.addAll(andCriteria.list());
  if(hostList != null){
     System.out.println("Host list size is "+hostList.size());
   }

输出:

Fetch size is 10
First result is 0
Host list size is 1003

我做错了什么?谢谢你。

【问题讨论】:

  • 试试criteria.setMaxResults(n)

标签: java spring hibernate criteria hibernate-criteria


【解决方案1】:

fetchSize与查询导出的记录数无关。它与获取的记录数有关。

你需要使用setMaxResults来限制hibernate检索的记录数。

设置要检索的最大行数。如果未设置,则检索的行数没有限制。

setFetchSize 仅与内部休眠获取记录组的方式有关(是一种缓存)。

为底层 JDBC 查询设置提取大小。

还有来自Statement的描述:

当此语句生成的 ResultSet 对象需要更多行时,向 JDBC 驱动程序提示应从数据库中获取的行数。如果指定的值为零,则忽略提示。默认值为零。

【讨论】:

    【解决方案2】:

    也许你应该在这里使用setMaxResults

    Here 是这两种方法的比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 2014-11-08
      • 2018-09-08
      • 2020-01-17
      • 2020-12-04
      相关资源
      最近更新 更多