![](/img/trans.png)
[英]Hibernate lazy-loaded collections and PropertyChangeSupport
[英]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;
...
}
当使用此实体图获取完整类别时, values
和children
项在初始查询中连接,但不获取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);
您还可以在此处阅读有关条件查询的更多信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.