gpt4 book ai didi

java - 优化 Spring-Data JPA 查询

转载 作者:太空狗 更新时间:2023-10-29 22:55:19 27 4
gpt4 key购买 nike

我正在为框架生成的查询寻找可能的优化。据我了解,流程如下:

  • 您可以将域对象声明为 POJO 并添加多个注释,例如 @Entity@Table@ManyToOne 等。

  • 您声明您的存储库,例如每个接口(interface)

对于 (2),您有多个选项来描述您的查询:例如每个方法名称或 @Query

如果我写这样的查询:

@Query("select t from Order t LEFT join fetch t.orderPositions where t.id = ?1")
Page<Order> findById(Pageable pageable, String id);

一个 SQL 查询是自动生成的,其中订单的每一列都被解析,随后是订单位置和依赖的对象/表。就好像我写道:

select * from order

因此,万一我需要一些来自几个连接对象的信息,查询可能会非常昂贵:而且更有趣但效率低下。我偶然发现了一个缓慢的查询,MySQL-explain 告诉我,在生成的 查询中,优化器无法使用索引,这很糟糕。

当然(我知道)我必须权衡,生成 SQL 不如手动 编写的最佳,并且具有编写更少的优势样板代码。

我的问题是:改进查询和查询执行的好策略是什么?

我自己想过一些选择:

1) 是否可以为不同的目的定义多个“实体”,例如用于访问订单的完整特征的 Order 以及类似 FilteredOrder 的东西 有更少的列并且没有解析 Join-columns?两者都将引用相同的表,但一个将使用所有列而另一个仅使用部分列。

2) 使用 @Query(... native="true") 选择我想要使用的所有列。这样做的好处是,我不会加倍我的域对象,也不会在我的代码库中乱放数百个Filtered-Objects。分页呢?将 pageable@Query( ...native="true") 结合使用仍然可行(恐怕不行)。

3) 最后但在我看来“最差”/样板解决方案:使用 JDBCTemplates 并在较低级别执行操作。

还有其他我没有想到的选择吗?感谢您对该主题的任何启发:]

更新:我们目前的策略如下

1) 在可能的情况下,我与 select new 一起工作因为我有 seen ,这适用于每个对象(无论是实体还是POJO)

2) 结合数据库 View ,可以充分利用SQLORM。对于某些用例,手头有一个聚合结果集可能会很有趣。将此结果集定义为 View ,可以很容易地从 db 的角度使用简单的 select 语句查看结果。对于 ORM 端,这意味着您可以轻松地定义一个与此 View 匹配的实体,并且您可以在顶部获得整个 ORM 优点:分页包括。

最佳答案

一种解决方案是使用 DTO:

@Query("select new FilteredOrder(o.name, o.size, o.cost) from Order o where o.id = ?1")
Page<FilteredOrder> findFilteredOrderById(Pageable pageable, String id);

如果您想要生成某些报告的实体,也许您应该考虑使用 nosql 数据存储?

关于java - 优化 Spring-Data JPA 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20120619/

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