gpt4 book ai didi

JPA渴望获取和分页最佳实践

转载 作者:行者123 更新时间:2023-12-05 00:23:07 25 4
gpt4 key购买 nike

经过一些研究,我发现了很多有关如何编写简单有效的代码(使用JPQL)的资料,这些资料包括:

  • 允许快速获取相关实体(例如,使用JOIN FETCH)。
  • 允许在单个实体上分页。

  • 但是,当将两者结合在一起时-不清楚如何以有效且干净的方式进行操作。
  • 要么它很渴望工作,但是在内存中应用了分页(也称为HHH000104:用集合fetch指定的firstResult/maxResults;在内存中应用!)
  • 可以使用分页,但是急切的获取不起作用(即使resultSet实际上包含相关实体),也会导致对数据库的附加查询,以批量获取每一行的相关实体。


  • 最有效的方法是
    https://vladmihalcea.com/fix-hibernate-hhh000104-entity-fetch-pagination-warning-message/

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

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

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

    最佳答案

    解决此问题的最简单方法是使用两个查询:

  • 在条件和分页条件下应用的第一个查询。该查询仅返回ids
  • 在第二个查询中,您使用在第一个查询中返回的ID,并在相关实体上创建FETCH

  • 例如,第一个查询:
    String jpql = "SELECT user.id FROM User user WHERE user.name = 'John'"

    Query q = em.createQuery(jpql);
    q.setFirstResult(0);
    q.setMaxResults(10);

    List<Long> ids = q.getResultList();
    第二个查询:
    String jqpl = "SELECT user FROM User user JOIN FETCH user.address WHERE user.id IN (:ids)"
    Query q = em.createQuery(jpql);
    q.setParameter("ids", ids);

    List<User> users = q.getResultList();
    如果需要按
    某些列来 排序,请注意。这两个查询中必须存在order by子句,因为数据库不遵守您在数据库返回行时通过参数传递的id顺序。

    关于JPA渴望获取和分页最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53569908/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com