小编典典

JPA:将获取结果连接到NULL的空白

hibernate

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

用户类别:

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

但是,有时我需要急于加载地图。为了避免在关闭Session后出现 LazyInitializationException
,我有两种检索Users的方法。

用户存储库:

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用户。


阅读 275

收藏
2020-06-20

共1个答案

小编典典

一个FETCH JOIN居然会解析为 内部 的SQL连接。这意味着User表中没有映射的任何记录/实体将从结果集中 删除
。您需要LEFT关键字FETCH JOIN来获得所有结果,即使没有地图也是如此。

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