gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:55:28 25 4
gpt4 key购买 nike

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

用户类:

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

但是,有时我需要预先加载 map 。为了避免在关闭 session 后出现 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 );
}

问题:
然而,JPQL JOIN FETCH 变体一次性加载用户和他的 map 返回 NULL 用户如果表中没有该用户的 map

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

最佳答案

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

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

关于java - JPA:在空的多边上将获取结果加入到 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43879474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com