我有一种情况,我得到了hiberate中的实体列表,但在主实体中我有另一个实体列表。我使用的实体:
emplistbean.java文件
@NamedNativeQueries({
@NamedNativeQuery(
name = "EmpList",
//Actual query involves lot of joins
query = " SELECT ID , NAME FROM EMPLOYEE WHERE EMP_ID=:EMPID"
,resultClass = EmpListBean.class
)
})
@Entity
public class EmpListBean {
@Column(name = "ID")
private int id;
@Column(name = "NAME")
private String empName;
// This is the list i need to retreive
@ManyToOne
@Column(name="workList")
private List<WorkListBean> workList;
//Getters & Setters
}
worklistbean.java文件
@NamedNativeQueries({
@NamedNativeQuery(
name = "WorkListBeanList",
query = " SELECT ID , NAME FROM Work_List WHERE EMP_ID=:EMPID"
,resultClass = WorkListBean.class
)
})
@Entity
public class WorkListBean {
@Column(name = "ID")
private int id;
@Column(name = "NAME")
private String workName;
//Getters & Setters
}
道层
Query query = session.getNamedQuery("EmpList");
query.setParameter("EMPID", myObj.getEmpId());
List<EmpListBean> oEmpListBean = query.list();
在执行dao层以下的代码时,我得到的“worklist”对象是空的,我知道这可以通过分别迭代emplistbean和分别调用worklistbean的named query来实现,但是由于数据量很大,这样做会花费太多时间,所以我想知道是否有任何方法可以在emplistbean中获取worklistbean。这里使用的两个实体仅供参考,我使用的实际查询很复杂,无法在本论坛中显示,并且它涉及许多表连接,因此请让我知道如何在hibernate中实现这一点。
4条答案
按热度按时间zbq4xfa01#
我知道这可以通过分别迭代emplistbean和分别调用worklistbean的named query来实现,但是由于数据量很大,这样做需要花费太多时间
我知道您想合并这两个查询以包含两个实体的数据,那么?
一旦
EmpListBean
以及WorkListBean
正确定义,即:您应该能够使用以下方法:
但是,不确定它是否适用于命名本机查询,您需要检查。
dddzy1tm2#
正如@javalerner所评论的,您应该使用@onetomany并使用fetch=“fetchtype.eager”添加eager-loading
并删除列注解
kyxcudwk3#
如果你想找一个简单的@onetomany,我喜欢abd的回答。
与其强迫bean总是急切地加载,不如使用fetch-join样式将这个概念合并到namednative查询中。使用这种方法,您可以创建对其关联在其他方面是惰性的对象的急切查询。在这种情况下,hibernate只会急切地通过您的查询获取数据,而且通常是懒惰的,我认为这是大多数人想要的。
随便用谷歌搜索一下。这是一篇写得很好的文章,也许能让你开门见山。
http://www.basilv.com/psd/blog/2008/improving-performance-via-eager-fetching-in-hibernate
祝你好运!
aor9mmx14#
得到任何东西
FetchType.LAZY
是的,你必须使用JOIN FETCH
在句子里。当你使用JOIN
你什么都有FetchType.EAGER
但不是什么FetchType.LAZY
是emplistbean.java文件
worklistbean.java文件
刀