小编Dmi*_*tov的帖子

JPA 急切获取和分页最佳实践

经过一番研究,我发现了很多关于如何编写简单有效的代码(使用 JPQL)的材料:

  1. 允许预先获取相关实体(例如使用 JOIN FETCH)。
  2. 允许对单个实体进行分页。

但是当涉及到将两者结合起来时 - 如何以有效和干净的方式做到这一点就变得不清楚了。

  • 要么是预先获取有效,要么在内存中应用分页(又名HHH000104:使用集合获取指定的 firstResult/maxResults;在内存中应用!

  • 要么是分页有效,但急切提取不起作用(即使resultSet实际包含相关实体),导致对数据库的额外查询以批量提取每一行的相关实体。


最接近的,实际上有效的是 https://vladmihalcea.com/fix-hibernate-hhh000104-entity-fetch-pagination-warning-message/

但这让我想知道是否有更直观、更干净的解决方案?

问题:关于如何使用分页和相关实体的急切获取,还有其他最佳实践吗?

注意:解决方案还应提供一种将过滤器应用于从数据库中检索的数据的方法。(例如JPQL WHERE 子句

pagination jpa eager jpql

9
推荐指数
1
解决办法
2950
查看次数

Intellij IDEA 评估表达式窗口和 Thread.currentThread().isInterrupted() 值

由于未知原因,我无法从Intellij IDEA 评估表达式窗口获得currentThread().isInterrupted() 的正确值。

这是一个小代码片段,可以帮助您重现相同的行为:

public class IsInterruptedTest {

    public static void main(String[] args) {
        Thread.currentThread().interrupt();

        System.out.println(Thread.currentThread().isInterrupted());
    }
}
Run Code Online (Sandbox Code Playgroud)

要重现它,请执行以下步骤:

  1. 设置断点在 System.out.println(Thread.currentThread().isInterrupted());
  2. 在调试模式下启动 main 方法

  3. 等到执行到达断点。

  4. Thread.currentThread().isInterrupted();从“评估表达式”窗口调用(Alt + F8)。(对我来说,这个调用返回false值)

  5. 恢复程序执行,一旦完成 - 检查控制台中打印的值。(对我来说true就在这里打印)

所以,我的问题是 - 为什么这两个值不同?

这是由于当前线程被调试器挂起而发生的吗?如果是这样,有什么方法可以isInterrupted()从IDE的“评估表达式”窗口中获取正确的调用值?

java multithreading intellij-idea

4
推荐指数
1
解决办法
285
查看次数

标签 统计

eager ×1

intellij-idea ×1

java ×1

jpa ×1

jpql ×1

multithreading ×1

pagination ×1