JPA:将获取结果联接为空多面的 NULL

2022-09-02 12:54:55

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

用户类:

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

但是,有时我需要急于加载地图。为了避免关闭会话后的懒惰初始化异常,我有两种检索用户的变体。

用户存储库:

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 );
}

问题:
但是,如果表中没有该用户的映射,则 JPQL JOIN FETCH 变体在一次加载用户和他的映射中返回 NULL 用户。

问:
我该如何重写JPQL语句以检索用户和可选的(!)所有映射,但是如果没有映射,那也没关系,但不要返回NULL用户。


答案 1

实际上,A 将解析为 SQL 中的内部联接。这意味着表中没有映射的任何记录/实体都将从结果集中删除。您需要关键字才能获得所有结果,即使是那些没有地图的结果。FETCH JOINUserLEFTFETCH JOIN

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

答案 2

推荐