【问题标题】:Does hibernate native query fetch child objects休眠本机查询是否获取子对象
【发布时间】:2015-09-15 03:13:52
【问题描述】:

我有一个名为“Book”的实体类,它有一个“Author”,这是另一个实体类,它是多对一的关系。 那么当我调用这个本机查询时,它是否也获取了作者?我真的不想获取 Author 对象,因为我只需要检索关于这本书的信息,而不是关于作者的信息。 (我觉得查询Author表比较浪费时间)

Query q = JPA.em().createNativeQuery("select * from Book where id =?",Book.class).setParameter(1,bookId);

如何使用本机查询仅获取没有作者信息的 Book 对象?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    你可以试试:

    @OneToMany(mappedBy = "columnName", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.LAZY)
    private Author author;
    

    所以这不会加载作者的数据。 每当您在任何地方执行getAuthor 时,它只会获取数据,否则不会。 FetchType.LAZY 告诉hibernate在读取Book的数据时不要读取数据。

    我建议如果只有1 child entity,那么你可以使用FetchType.EAGER,但如果有more than one child entity,那么最好不要使用EAGER。那时候LAZYfetch 类型比较好用。

    我上面关于获取类型的休眠配置的代码基础知识。

    【讨论】:

    • 这听起来不对。首先,如果是 OneToMany 关系,那么 author 应该是 List 或 Set。其次,我的情况是多对一关系。在这种情况下,它总是急切地获取。此外,我不想仅仅因为这个查询而更改我的实体类。在其他情况下,我可能需要总是渴望获取。如何在不同的问题中停止急切地获取 OneToOne 或 ManyToOne。只是简单地添加 FetchType.LAZY 不起作用
    • 对对,应该是实体类的集合元素。我在回答中也说过,对于基本概念,我已经给出了示例。
    • 但是你的例子对我没有帮助。这是一个完全不同的场景。我的问题是关于原生查询,而不是 HQL
    • 是的,对于 LAZY fetch 类型的特殊场景处理,我会尽快发布。我去做。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2017-10-08
    • 1970-01-01
    相关资源
    最近更新 更多