【问题标题】:Global setMaxResult in JPA HibernateJPA Hibernate 中的全局 setMaxResult
【发布时间】:2012-07-24 17:47:32
【问题描述】:

App使用JPA Hibernate,数据库是Sybase;每个域类型都有几个搜索屏幕。我知道 query.setMaxResult(limit) 会阻止查询返回太多。在 Sybase 的情况下,我相信它会被翻译成使用:

select top n from table --n = limit

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

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

【问题讨论】:

    标签: java hibernate jpa limit sybase


    【解决方案1】:

    没有全局设置,你真的不想要这样的设置。事实上,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 实体。

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

    【讨论】:

    • 您好 JB,感谢您指出这一点!我没有意识到这会影响实体关联。在这种情况下,我是否别无选择,只能访问每个 Query 并为所有 7 个搜索 dao(每个搜索屏幕 1 个)调用 setMaxResults(limit) ?或者也许这可以通过 AOP 或过滤来完成,尽管它发生在 DAO 层......?
    • 你只有7个?然后一定要访问每个查询。
    • 所以.....答案是在 JPA 中没有办法做到这一点? (我认为 BatchSize 注释可以在休眠状态下工作)。但是如果 JPA 不能这样做,那就太令人沮丧了
    猜你喜欢
    • 2015-12-06
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 2015-03-20
    • 2014-01-16
    相关资源
    最近更新 更多