【问题标题】:Understanding FetchType.Lazy, force in JPQL query (OpenJPA)理解 FetchType.Lazy,强制 JPQL 查询(OpenJPA)
【发布时间】:2012-09-21 00:37:28
【问题描述】:

我有一个这样的实体:

public class Configuration {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    @Element(name = "user_id", data = true, required = false)
    private Users users;
}

我想要定义一个查询,其中一次执行 LazyLoading,另一次不执行。

但是查询:

@NamedQuery(name = "getNondeletedConfiguration", query = "SELECT c FROM Configuration c  "
                     + "LEFT JOIN c.users users WHERE c.deleted = false"),

不将用户加载到对象中。

强制加载用户对象的方法是访问代码中某处的属性。但是,这不起作用,我不想要这种行为。我想仅根据我的 JPQL 语句来控制延迟加载。我不希望 openJPA 神奇地加载对象,因为它通过 Java 代码中某处的 get 方法检测到访问。

我想这是一个常见问题,我只是误解了一些东西。 但是,我找不到有关该问题的文档。

【问题讨论】:

    标签: jpa persistence jpql openjpa


    【解决方案1】:

    需要添加fetch关键字来加载关联:

    select c from Configuration c left join fetch c.users where c.deleted = false
    

    请注意,代表一个用户的实体名称Users 的选择确实很糟糕,而且非常混乱。与字段名称 users 相同。你应该删除最后的s,这会让每个读者都认为一个配置有很多用户。

    【讨论】:

    • 谢谢我找到了这篇文章,但你说得对:) eubauer.de/kingsware/2011/02/10/… 有没有办法完全防止多对一关系被获取?在另一个查询中,我希望不获取 ManyToOne 关系(即使可能有人调用“getUser(s)”)。是否有类似的方法可以在 JPQL 查询中告诉 openJPA 不获取对象?
    • 没有。如果需要,请使用 DTO,而不是实体。
    • 感谢 JB 的回答,不幸的是,用户处带有“s”的命名约定是一个非常古老且难以修复的设计错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2014-01-07
    • 2011-08-26
    • 2013-01-16
    • 1970-01-01
    • 2023-03-17
    • 2017-03-10
    相关资源
    最近更新 更多