首页 > 解决方案 > 本机查询中的休眠 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]

如何解决?

标签: javahibernatespring-bootspring-data

解决方案


推荐阅读