我有一个常见的亲子关系的情况,比如:
class Parent {
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
List<ChildOne> childrenOne;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
List<ChildTwo> childrenTwo;
@OneToMany
List<LazyChild> lazyChildren;
@Id
Long id;
}
然后我有如下的HQL查询:
select lazyChild from Parent p
join p.lazyChildren lazyChild
where p.id = ? and lazyChild.mnemonic='AAA'
当我执行它的时候,我得到了LazyChild对象,它就是我想要的。但是hibernate也会初始化所有急切定义的集合,这是我不想要的。hibernate发出单独的调用来获取渴望的关联,这是不直观的。我通过切换到show SQL query来查看它。
如何避免不必要的SQL调用?
发布于 2014-08-06 07:33:02
通过指定FetchType.EAGER
,您已经告诉Hibernate,每次加载父对象时,您都希望它加载这些子对象。如果您不希望发生这种情况,则不能指定急切获取类型。
Hibernate不够聪明,不知道当您查询Parent
时,您只需要lazyChild。它所知道的就是您已经向Parent
对象发出了一个请求,所以它需要加载急切的抓取子对象。
如果你是Hibernate的新手,你可能会发现我的教程here很有帮助。
发布于 2014-08-06 09:42:07
我不太明白你想做什么。但是如果你不想加载你的集合childrenOne
和childrenTwo
,你可能应该用FetchType.LAZY
来声明它们。
在我看来,你没有查询到正确的实体,如果你只是想要一个LazyChild
列表,那么你的HQL应该是这样的:
from LazyChild child
where child.parent.id = ? and child.mnemonic='AAA'
假设您在LazyChild
实体中映射了父实体:
@ManyToOne //(fetch=FetchType.LAZY) if you don't need to have the parent loaded
@JoinColumn(name = "parent_id")
private Parent parent;
https://stackoverflow.com/questions/25154542
复制相似问题