我和用户与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用户。
一个FETCH JOIN居然会解析为 内部 的SQL连接。这意味着User表中没有映射的任何记录/实体将从结果集中 删除 。您需要LEFT关键字FETCH JOIN来获得所有结果,即使没有地图也是如此。
FETCH JOIN
User
LEFT
@Query("SELECT u FROM User u LEFT JOIN FETCH u.maps WHERE u.id = (:id)") public User findByIdEagerFetch( @Param("id") Long id );