java - 本机查询中的休眠 n+1 (Spring Data)
问题描述
我在 Postgres 中有三个表
create table pool(
id PK
);
create table coin(
id PK
);
create table pools_coins(
id PK,
pool_id references to pool,
coin_id references to coin
);
映射仅在 Pools 类中进行
public class Pool extends Identifiable {
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "pools_coins",
joinColumns = {@JoinColumn(name = "pool_id")},
inverseJoinColumns = {@JoinColumn(name = "coin_id")})
private List<Coin> coins;
现在我想使用 Spring Data 获取包含 Coins 列表的池:
@Query(
nativeQuery = true,
value = "SELECT p.*,c.* FROM pools p " +
" INNER JOIN pools_coins pc ON " +
" p.id = pc.pool_id " +
" INNER JOIN coins C ON C.id = pc.coin_id " +
" WHERE p.id = :id ;"
)
Pool findPoolsWithCoins(@Param("id") long id);
我启用sql-logging
并看到两个查询
2019-01-28 11:44:52.154 DEBUG 9262 --- [0.1-8080-exec-1] org.hibernate.SQL : SELECT p.*,c.* FROM pools p INNER JOIN pools_coins pc ON p.id = pc.pool_id INNER JOIN coins C ON C.id = pc.coin_id WHERE p.id = ? ;
2019-01-28 11:44:52.159 TRACE 9262 --- [0.1-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [1]
2019-01-28 11:44:52.186 DEBUG 9262 --- [0.1-8080-exec-1] org.hibernate.SQL : select coins0_.pool_id as pool_id1_6_0_, coins0_.coin_id as coin_id2_6_0_, coin1_.id as id1_1_1_, coin1_.ann_url as ann_url2_1_1_, coin1_.collateral_price as collater3_1_1_, coin1_.current_local_release as current_4_1_1_, coin1_.discord_url as discord_5_1_1_, coin1_.explorer_params_class_name as explorer6_1_1_, coin1_.explorer_params_password as explorer7_1_1_, coin1_.explorer_params_url as explorer8_1_1_, coin1_.explorer_params_username as explorer9_1_1_, coin1_.explorer_url as explore10_1_1_, coin1_.first_pos_block as first_p11_1_1_, coin1_.genesis_block_time as genesis12_1_1_, coin1_.indexed as indexed13_1_1_, coin1_.logo_url as logo_ur14_1_1_, coin1_.name as name15_1_1_, coin1_.source_url as source_16_1_1_, coin1_.ticker as ticker17_1_1_, coin1_.twitter_url as twitter18_1_1_, coin1_.url as url19_1_1_, coin1_.visible as visible20_1_1_ from pools_coins coins0_ inner join coins coin1_ on coins0_.coin_id=coin1_.id where coins0_.pool_id=?
2019-01-28 11:44:52.186 TRACE 9262 --- [0.1-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [1]
如何解决?
解决方案
推荐阅读
- java - JPARepository 保存方法返回null?
- python - 子元素有它的命名空间(不同于父元素的命名空间)。如何使用 LXML 找到子元素?
- process - 将项目需求与 Spyder IDE 中的代码匹配
- javascript - 身体之间的摩擦不工作 MatterJS
- c++ - 为什么“GetDeviceCaps”函数总是返回我屏幕大小的一半?
- c - 无法使用指针在 C 中的结构变量中赋值
- ios - SwiftUI ScrollView 制动内部视图的行为
- java - 如何在 android studio 中创建一个 retrofit2 数组?
- python - 如何让python脚本重新连接IBKR TWS API?东部时间下午 5 点断开连接几乎总是会终止脚本
- python - 如何使用 Python 从网站获取 json 字符串?