当前位置: 首页 > 知识库问答 >
问题:

Hibernate做了太多的查询

颜昕
2023-03-14

我的申请中有一个性能问题。

我有三个实体,其关系如下:

one Order => many OrderLines => Many Cards

从数据库加载实体需要太多时间,orderLines加载的是急切加载,而Cards加载的是惰性加载。为了让应用流畅,懒惰加载是必要的。

我需要为一个案例配置即时加载,我需要帮助。

我正在使用jhsipster stack:spring boot和JPA

我试图编写Hql查询

@Query(value = "from Order as order "
        + "inner join order.orderLines as orderLines "
        + "inner join orderlines.cards gc "
        + "where order.id= :order")
Order findWithDependencies(@Param("order")Long order);

我有un错误:意外的令牌订单(第2行)

我尝试了原生查询

@Query(value = "select * "+ 
        "from order_table ot "+
        "left join order_line ol ON ot.id = ol.order_id "+
        "left join  giftcard gc ON gc.orderline_id = ol.id "+
        "where ot.id=:order", nativeQuery= true)
Order findWithDependenciesNative(@Param("order")Long order);

但当我这么做的时候

orderLine.getCard()

从代码中,Hibernate仍然执行查询以从数据库获取数据,这导致了我的性能问题。

必要的实体代码:

public class Order implements Serializable {
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "order_id", nullable = false)
    @Size(min = 1)
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @JsonProperty("detail")
    @Valid
    private List<OrderLine> orderLines = new ArrayList<>();
}
public class OrderLine extends AbstractAuditingEntity implements Serializable, Comparable {
    @OneToMany
    @JoinColumn(name = "orderline_id")
    @JsonIgnore
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<Giftcard> giftcards = new HashSet<>();
}

public class Giftcard extends AbstractAuditingEntity implements Serializable, Comparable {
    @ManyToOne(optional = true)
    @JoinColumn(name= "orderline_id")
    @JsonIgnore
    private OrderLine orderLine;
}

实际上是我的代码

{
    Order order = orderRepository.findWithDependenciesNative(linkFile.getOrder());
    //Some code
    List<OrderLine> orderLines = order.getOrderLines();
    orderLines.sort(Comparator.comparing(OrderLine::getId));
    for (OrderLine orderLine : orderLines) {
        Stream<Card> cards = orderLine.getCards().stream().sorted(Comparator.comparing(Card::getCardNumber));
        for (Card card : cards.collect(Collectors.toList())) {
        //Some code
        }
    }

问题是在第二个foreach中,对于每个卡,hibernate执行两个查询,而带有join的请求不会加载数据,比如eager配置。你有办法帮我吗?

非常感谢

共有1个答案

欧渝
2023-03-14

使用“join fetch”避免延迟加载。“fetch”联接允许使用单个select来初始化值的关联或集合及其父对象。这在收集的情况下特别有用。它有效地覆盖了关联和集合的映射文件的外部联接和延迟声明。请参阅有关join fetch的更多信息:Hibernate中join和join fetch的区别

@Query("Select order from Order as order "
        + "inner join fetch order.orderLines as orderLines "
        + "inner join fetch orderlines.cards gc "
        + "where order.id= :order")
Order findWithDependencies(@Param("order")Long order);
 类似资料:
  • 问题内容: 我有一个字符串中的ID列表,并且想使用Hibernate来获取具有这些ID的行。是一个Hibernate / JPA实体(对不起,如果我在这里混淆了命名)。 我的代码是: 但这失败了: 如何使零件工作?谢谢。 问题答案: JPQL查询的语法不正确。两种使用(带有位置参数): 或(使用命名参数): 以下是JPA 1.0规范中有关参数的相关部分: 4.6.4.1位置参数 以下规则适用于位置

  • 我对JS有问题。我正在尝试制作三个按类型排序的配料列表(用于酿造药剂),所有这些都是标签中的复选框。 你应该选择(选中)三个列表中的每一个元素,以便酿造药水。如果你选择了正确的成分,然后按下“酿造药水”按钮,你就有了一种确定的药水,如果你选择三种不匹配的成分,它会显示 在页面底部写着“看来这次没用了!”按下“酿造药水”按钮后。 在JavaScript中,我对三个列表都使用了一个数组,对每个列表中的

  • 我正在开发一个spring批处理应用程序(内存为2GB),尝试处理数据(在处理过程中使用select查询获取数据),并在postgres DB中插入大约100万条处理过的记录。我在这个项目中使用Spring Data JPA。但是Spring JPA在处理这些记录时消耗了太多内存

  • 任何解决这一问题的建议都将不胜感激。或者我们可以用另一种方式来计数?我想补充一些细节。滑动大小是一个事件和窗口大小超过10小时(每秒大约有300个事件),我们需要对每个事件做出反应。所以在这种情况下,我们没有使用Flink提供的窗口。我们使用来存储前面的信息。在中用于触发旧数据的清理作业。最后dinstinct键的数量非常多。

  • 我是Android SDK/API环境的新手。这是我第一次试着画一张图/图表。我尝试使用3个不同的免费库在模拟器上运行不同类型的示例代码,但布局屏幕上没有显示任何内容。logcat将重复以下消息: 当我运行与一个许可库的评估副本相关的示例代码时,问题并没有持续存在,并且图表工作了。

  • (Android)在音乐播放器上,您可以按预期更新搜索栏,如下所示: 但是,如果重点放在搜索栏上,则不间断、稳定地反馈进度。类似于“搜索控制25%,“搜索控制25%”,“搜索控制25%,搜索控制26%,“寻找控制26%”,“查找控制27%” 我缺少某物,但无法解决问题。我已将contentDescription设置为除@null之外。但是这次它没有停止读取内容描述。 在Spotify客户端上,我检