理解FetchType.Lazy,强制执行JPQL查询(OpenJPA)

seb*_*ner 2 persistence jpa openjpa jpql

我有一个像这样的实体:

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

我想要的是定义一个查询,其中一次执行LazyLoading,而另一次不执行.

但查询:

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

不将用户加载到对象中.

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

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

JB *_*zet 8

您需要添加fetch关键字以加载关联:

select c from Configuration c left join fetch c.users where c.deleted = false
Run Code Online (Sandbox Code Playgroud)

请注意,Users代表一个用户的实体的名称选择非常糟糕,而且非常令人困惑.字段名称相同users.你应该删除final s,这使得每个读者都认为配置有很多用户.