相关疑难解决方法(0)

优化Spring-Data JPA查询

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

  • 你可以声明你的域对象是POJO和增加几个注解像@Entity,@Table,@ManyToOne等等.

  • 你声明你的存储库,例如每个接口

使用(2),您可以使用多种方法来描述查询:例如,按方法名称或 @Query

如果我写一个像这样的查询:

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

自动生成SQL查询,其中订单的每一列都被解析,并且顺序依次为orderpositions和依赖obejcts/tables.好像我写道:

select * from order
Run Code Online (Sandbox Code Playgroud)

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

当然(我知道)我必须处理权衡,生成的 SQL不像手动编写那样最优,并且具有编写较少样板代码的优点.

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

我自己想过一些选择:

1)是否可以为不同的目的定义几个"实体",例如Order访问订单的完整特征以及FilteredOrder更少的列和没有解决方案Join-columns?两者都会引用相同的表,但是一个将使用所有列而另一个只使用一些.

2)使用@Query(... native="true")我想要使​​用的所有列的选择.这样做的好处是,我不会将我的域对象加倍,并且会使用数百个对象Filtered丢弃我的代码库.分页怎么样?使用pageable结合@Query( ...native="true")仍然有可能(恐怕没有).

3)最后但在我看来"最糟糕"/样板解决方案:使用JDBCTemplates并在较低级别执行操作.

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

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

1)在可能的情况下,我使用select new 正如我所见 …

java spring-data-jpa

15
推荐指数
1
解决办法
1万
查看次数

标签 统计

java ×1

spring-data-jpa ×1