给定一个具有多个(例如 5 个)不同搜索屏幕的 Web 应用程序(Java、Spring、Hibernate 和 Sybase 作为数据库),我想首先计算基于用户条件的搜索结果是否超出限制(例如 1000 行) 。即使用户提供合理的过滤器和标准,也可能会出现超过 1000 个的巨大结果。
建议这样做:
- 从表 --clauses 等中选择 count(*)
- 如果 > 1000,则不进行实际搜索,返回并显示限制错误(告诉用户优化搜索)
- else if < 1000,进行实际搜索并将结果集返回给用户
或者有更好的解决方案来处理这个问题吗?
如果这是要走的路,我的后续问题是,我们如何避免重复 sql 查询?因为我知道这样做,所以需要我声明相同的搜索 sql,除了 select 子句仅包含 count(*)。
更新
此外,我想避免两件事: 1.从执行实际sql开始处理 2. ORM(本例中为 Hibernate)加载/映射域对象 *当我检测到计数 > 1000 时,1 和 2 都会被避免。
最佳答案
我根本不会运行 COUNT(*)
,只是使用 LIMIT 1001
运行查询。您很可能在计数中生成完全相同的结果集(即,要执行 COUNT,您必须生成结果集),并且下一次命中将来自缓存,或者最坏的情况是您必须重新计算。你只是做了两次同样的工作
关于java - 在进行实际搜索之前计算行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11642975/