当前位置: 首页 > 面试题库 >

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

濮俭
2023-03-14
问题内容

我和用户与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来获得所有结果,即使没有地图也是如此。

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


 类似资料:
  • 问题内容: 我和用户与GameMap之间存在一对多的关系。一个用户可以拥有许多地图。 用户类别: 但是,有时我需要急于加载地图。为了避免在关闭Session后出现 LazyInitializationException ,我有两种检索Users的方法。 用户存储库: 问题: 但是, 如果表中没有该用户的映射 ,那么JPQL JOIN FETCH变体希望一次加载该用户,并且他的映射返回NULL用户。

  • 我正在使用Datastax spark-Cassandra-connector访问cassandra中的一些数据。我的要求是将RDD与Cassandra表连接起来,获取结果并将其存储在配置单元表中。 我正在犯错误 你能帮我把转换成数据文件吗?

  • 我开始使用JOOQ和dvd租赁商店数据库aka sakila。基本上,我想找一个演员和他的角色(我创建的表)。到目前为止,我想到了这个: 我希望能够将演员及其角色提取到一个对象中:DTO。我找到了这篇文章https://arnaudroger.github.io/blog/2017/03/02/jooq-one-to-many-without-dto.html但我发现使用sfm的解决方案过于冗长,

  • 我的数据库中有一个小特例,我需要从两个具有一对一关系的不同表中获取数据,以获得有用的结果。获取看起来像这样: 当然,我在实际代码中使用了-这只是一个示例。我的问题是是否以及如何将jOOQ中获取的数据写入POJO。我不确定是否有办法让jOOQ为我生成这个POJO,但如果我必须自己编写它,我假设我需要像适配器这样的东西以及像作为数据类型的转换器。 我看到有可能出现RecordMapperProvide

  • 我有这些Postgres表: 实体: !!注意!!!员工与Twap之间没有关系 我创建了这个JPA存储库: 如您所见,我使用此界面获得结果: 当我运行代码时,我得到: 你知道会出什么问题吗?结果我总是得到空值。当我在SQL编辑器中运行这个查询时,我得到了正确的表和结果。

  • 我想使用以下查询获得结果列表: 我在它的实体类中使用了它,但我得到了异常: 当用户成功登录应用程序时,将获得matricula字段。应该通过CDI在NamedQuery中设置它来查询数据库。matricula字段位于另一个不同于此处映射的表中。 如何设置注入的setsionChave字符串在参数的矩阵,这是XRlzConsolado类类型? 豆子: 有3个实体:XRlz、XRlzConsolado