java - JPA Hibernate 中的全局 setMaxResult

标签 java hibernate jpa limit sybase

App使用JPA Hibernate,数据库为Sybase;它针对每种域类型都有多个搜索屏幕。我知道 query.setMaxResult(limit) 将防止查询返回太多。对于 Sybase,我相信它会被翻译为使用:

select top n from table --n = limit

但是,是否有一个全局设置可供我配置,以便应用程序的所有查询都能识别此限制,它是什么以及如何使用?

接下来的问题是,我将配置 1 或 2 个查询,使其 setMaxResults 为 limit+1000,执行 query.setMaxResult(limit+1000) 将覆盖全局设置正确?

最佳答案

没有全局设置,而且您确实不想要这样的设置。事实上,setMaxResults() 对于大量查询来说没有意义。

特别是,如果查询加载一个实体和至少一个一对多关联,则不应使用 setMaxResults()。它限制从数据库返回的行数,而不是从查询返回的实体数。因此,假设您有具有以下关联的实体 A 和 B:

A1 - B1
A1 - B2
A1 - B3
A2 - B4
A2 - B5
A2 - B6

想象一下您执行以下查询:select a from A a left join fetch a.b。如果将最大结果设置为 4,则返回的行可能为

A1 - B1
A1 - B2
A1 - B3
A2 - B4

最终您将得到具有所有 B 的 A1 实体,以及仅具有一个 B 而不是全部 3 个 B 的 A2 实体。

不过,没有什么可以禁止您实现某种可重用的查询模板,该模板会自动应用最大结果。但盲目地将其应用于所有查询是错误的。

关于java - JPA Hibernate 中的全局 setMaxResult,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11664244/

相关文章:

java - 抑制 Java Ctrl+Break 行为

Java HttpClient - 通过代理发布文件

java - hibernate 教程

java - 如何获取 Eclipselink 实体管理器?

java - Hibernate/JPA OneToMany 是否应该在两侧进行更新?

java - hibernate/JPA : could not set a field value by reflection setter

java - 带有 Google Play 服务的 Android 地理围栏 6.5.87

java - 在读取操作中使用 Hibernate 的 StaleObjectStateException?

hibernate - 如何使用 Hibernate 配置自定义消息插值?

java - 如何将循环中的阻塞调用更改为Java中的异步调用