繁体   English   中英

急切地用hibernate获取一个延迟加载的clob

[英]Eagerly fetching a lazy-loaded clob with hibernate

在使用带有 oracle 数据库的休眠(和 hibernate-enhance-maven-plugin 以启用 lob 的延迟加载)的 Spring Boot 应用程序中,我有一个具有延迟加载的Value集合的类Category

@Entity
@NamedEntityGraph(name = "Category.full",
        attributeNodes = @NamedAttributeNode(value = "values", subgraph = "categoryValue"),
        subgraphs = {
            @NamedSubgraph(name = "categoryValue", attributeNodes = {
                    @NamedAttributeNode("children"), @NamedAttributeNode("detail")
            })
        })
public class Category {

...

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "type")
    @OrderBy("sequence")
    private Set<Value> values = new HashSet<>();

...

}

Value 有一个延迟加载的集合children和一个延迟加载的 clob detail

@Entity
public class Value {

...

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "parent")
    @OrderBy("sequence")
    private Set<Value> children = new HashSet<>();

    @Lob
    @Basic(fetch = FetchType.LAZY)
    @Column(name = "Detail")
    private String detail;

...

}

当使用此实体图获取完整类别时, valueschildren项在初始查询中连接,但不获取detail ,并且为每个值发送单独的查询,由于这些字段大部分为空,因此效率低下。

在获取完整类别时是否有任何方法可以批量获取此字段,同时默认情况下仍具有延迟加载?

您可以使用 Criteria Query 来满足您的要求。

@Autowired
private EntityManager em;


CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Value> criteria = builder.createQuery(Value.class).distinct(true);
Root<Value> value = criteria.from(Value.class);
// Add below code to eagerly fetch detail to avoid multiple query
value.fetch("children", JoinType.INNER);
criteria.select(value);

您还可以在此处阅读有关条件查询的更多信息

https://www.baeldung.com/spring-data-criteria-queries

https://www.baeldung.com/jpa-join-types

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM