如何在 Spring Boot JPA 中的 OneToMany 中为孩子获取 Null 值

Posted

技术标签:

【中文标题】如何在 Spring Boot JPA 中的 OneToMany 中为孩子获取 Null 值【英文标题】:How get Null value for child in OneToMany in Spring Boot JPA 【发布时间】:2020-09-28 22:35:36 【问题描述】:

我需要为孩子获取具有空值的简单父对象列表。 但是当我使用 findAll() 方法然后尝试获取子对象时,我得到了 LazyInitializationException:未能延迟初始化角色集合:...无法初始化代理 - 无会话 我看到了这个问题的解释(关于 Lazy/Eager,JOIN FETCH),但我需要为子对象获取 null 而无需查询子对象。

@Entity
public class Parent 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "parent")
    Set<Child> childs;

@Entity
public class Child 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    Parent parent;

@Service
    public class ParentService 

    @Autowired
    ParentRepository parentRepository;

    public List<Course> getParentList() 
        return parentRepository.findAll();
    

在休眠中我得到正确的查询:

select parent0_.id as id1_0_ from parent parent0_

在测试之前,我在数据库中添加了几个父实体,结果不为空,并且在此测试中我得到错误 LazyInitializationException

@Test
    public void checkParentListFormat() 
        List<Parent> parentList = parentService.getParentList();
        Assertions.assertThat(parentList.get(0).getChilds()).isNull();
    


我阅读了有关 DTO 的信息,但是否可以获得具有空值的简单实体?谢谢

【问题讨论】:

【参考方案1】:

我认为您需要将延迟初始化放在父注释中。

@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
Set<Child> childs;

【讨论】:

是的,我试过了,但情况没有改变。对于 oneToMany,默认获取类型是 Lazy,当直接设置 Lazy 时,没有任何变化。我看到类似的问题,似乎如果对象有孩子,没有不同的对象(DTO)就无法获得它们。例如,我需要只有 parentId 字段的 ParentDTO 对象。在这种情况下,我会得到我需要的。 所以,我需要获取所有孩子或使用我需要的字段创建不同的对象 (DTO) 并获取此对象。如果有人知道如何停止休眠,请尝试在选定的查询中获取孩子,这将是很棒的。现在我将使用 DTO。

以上是关于如何在 Spring Boot JPA 中的 OneToMany 中为孩子获取 Null 值的主要内容,如果未能解决你的问题,请参考以下文章

如何区分 JPA Spring boot?

如何在JAVA JPA Spring Boot中的一个SQL查询中选择多个数据

Spring Boot JPA:如何查询表中的 JSON 列

java - 如何在spring boot java中编写一个函数来处理JPA存储库中的自定义查询?

spring-boot-starter-data-jpa 中的 Eaxmple 如何使用

如何使用 Spring Boot JPA 在 Postgres 中存储几何点?