0

给定一个具有多个(例如 5 个)不同搜索屏幕的 Web 应用程序(Java、Spring、Hibernate 和 Sybase 作为 DB),我想首先计算基于用户条件的搜索结果是否会超过限制,例如 1000 行。即使用户提供了合理的过滤器和标准,也可能会出现超过 1000 个的巨大结果。

这样做是推荐的:

  1. select count(*) from table --clauses, etc here
  2. 然后如果 > 1000,不进行实际搜索,返回并显示限制错误(告诉用户细化搜索)
  3. 否则如果 < 1000,进行实际搜索并将结果集返回给用户

还是有更好的解决方案来处理这个问题?

如果这是要走的路,我的后续问题是,我们如何避免重复 sql 查询?因为我理解这样做,所以需要我声明相同的搜索 sql,除了 select 子句将只包含 count(*)。

更新

此外,我想避免两件事: 1. 执行实际 sql 的处理 2. ORM 加载/映射域对象(在这种情况下为休眠) *当我检测到计数时避免 1 和 2 > 1000。

4

3 回答 3

2

我根本不会运行 a COUNT(*),只需使用 a 运行查询LIMIT 1001。您很可能在计数中生成完全相同的结果集(即,要执行 COUNT,您必须生成结果集),并且下一次命中将来自缓存,或者最坏的情况您将不得不重新计算。你只是在做同样的工作两次

于 2012-07-25T05:03:46.960 回答
0

根据您从行集中检索行的方式,您可以简单地过滤该级别的结果。

IE

int rowIndex = 0;
while (rs.hasNext() && rowIndex < 1000) {
    // ... Extract results
    rowIndex++;
}

您可能想警告用户结果集已被修剪;)

于 2012-07-25T05:01:55.090 回答
0

我们的应用程序也遵循相同的程序。是的,唯一的区别是在 SQL 中放置 count(1) 而不是 *。

但是,您可能需要了解,有时计数查询会花费更多时间然后获取结果子集。

于 2012-07-25T05:01:02.800 回答