JPA:在空的多边上将获取结果加入到 NULL

JPA: Join Fetch results to NULL on empty many side

我在 User 和 GameMap 之间有一个一对多的关系。一个用户可以拥有多张地图。

用户class:

// LAZY LOADED
@OneToMany(cascade = CascadeType.ALL, mappedBy = "creater")
private final List<GameMap> maps = new ArrayList<>();

但是,有时我需要提前加载地图。为了避免在关闭会话后出现 LazyInitializationException,我有两种检索用户的变体。

用户存储库:

public interface UserRepository extends JpaRepository<User, Long> {

    Optional<User> findById( Long id );

    @Query("SELECT u FROM User u JOIN FETCH u.maps WHERE u.id = (:id)")
    public User findByIdEagerFetch( @Param("id") Long id );
}

问题:
但是,如果 table[=32= 中没有此用户的地图,则 JPQL JOIN FETCH 变体会一次性加载用户和他的地图 return 一个 NULL 用户 ].

问题:
我如何重写 JPQL 语句以检索用户和可选的(!)他的所有地图,但如果没有地图,那没关系,但不要 return 一个 NULL 用户。

A​​ FETCH JOIN 实际上将解析为 inner 加入 SQL。这意味着 User table 中没有映射的任何 records/entities 将从结果集中 删除 。您需要在 FETCH JOIN 上使用 LEFT 关键字才能获得所有结果,即使是那些没有地图的结果。

@Query("SELECT u FROM User u LEFT JOIN FETCH u.maps WHERE u.id = (:id)")
public User findByIdEagerFetch( @Param("id") Long id );