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 );
我在 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 );