Java hibernate实体中具有@NamedNativeRequesties的实体列表
我有一种情况,我在Hibrate中得到一个实体列表,但在主实体中我有另一个实体列表。我使用的实体: EmpListBean.javaJava hibernate实体中具有@NamedNativeRequesties的实体列表,java,spring,spring-boot,hibernate,jpa,Java,Spring,Spring Boot,Hibernate,Jpa,我有一种情况,我在Hibrate中得到一个实体列表,但在主实体中我有另一个实体列表。我使用的实体: EmpListBean.java @NamedNativeQueries({ @NamedNativeQuery( name = "EmpList", //Actual query involves lot of joins query = " SELECT ID , NAME FROM EMPLOYEE WHE
@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
}
@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
}
@OneToMany(fetch = FetchType.LAZY, mappedBy="empListBean")
private List<WorkListBean> workList;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="EMP_ID")
private EmpListBean empListBean;
道层
Query query = session.getNamedQuery("EmpList");
query.setParameter("EMPID", myObj.getEmpId());
List<EmpListBean> oEmpListBean = query.list();
Query Query=session.getNamedQuery(“EmpList”);
setParameter(“EMPID”,myObj.getEmpId());
List-oEmpListBean=query.List();
当执行DAO层以下的代码时,我得到的“workList”对象为空,我知道这可以通过单独迭代EmpListBean和单独调用WorkListBean的命名查询来实现,但由于数据量巨大,这样做需要花费太多时间,所以我想知道是否有任何方法可以在Emplistbean中获取WorkListBean。这里使用的两个实体仅供参考,我使用的实际查询非常复杂,无法在本论坛中公开,并且涉及大量的表连接,因此请告诉我如何在hibernate中实现这一点。正如@Javalerner评论的那样,您应该使用@OneTomany,并使用fetch=“FetchType.Eager”添加急切加载 然后删除列注释
@OneToMany(fetch = FetchType.EAGER)
private List<WorkListBean> workList;
@OneToMany(fetch=FetchType.EAGER)
私有列表工作列表;
正如@Javalerner所评论的,您应该使用@OneTomany并使用fetch=“FetchType.eanger”添加即时加载
然后删除列注释
@OneToMany(fetch = FetchType.EAGER)
private List<WorkListBean> workList;
@OneToMany(fetch=FetchType.EAGER)
私有列表工作列表;
我知道这可以通过分别迭代EmpListBean和分别调用WorkListBean的命名查询来实现,但由于数据量巨大,这样做需要花费太多时间
我知道您想要合并这两个查询以包含这两个实体的数据,那么
一旦正确定义了EmpListBean
和WorkListBean
之间的关联,即:
class EmpListBean {
...
@OneToMany
@JoinColumn(name = "EMP_ID")
private List<WorkListBean> workList;
}
但是,不确定它是否适用于命名的本机查询,您需要进行检查
我知道这可以通过分别迭代EmpListBean和分别调用WorkListBean的命名查询来实现,但由于数据量巨大,这样做需要花费太多时间
我知道您想要合并这两个查询以包含这两个实体的数据,那么
一旦正确定义了EmpListBean
和WorkListBean
之间的关联,即:
class EmpListBean {
...
@OneToMany
@JoinColumn(name = "EMP_ID")
private List<WorkListBean> workList;
}
但是,不确定它是否适用于命名的本机查询,您需要检查。如果您正在寻找一个简单的@OneToMany,我喜欢Abd的响应 您可能不想强迫bean总是进行即时加载,而只想使用FETCH-JOIN样式将此概念合并到NamedNative查询中。使用这种方法,您可以对关联在其他方面是惰性的对象创建渴望的查询。在这种情况下,Hibernate只会急切地通过您的查询获取数据,而且通常是懒惰的,我认为这是大多数人想要的 随便用谷歌搜索一下。这是一篇写得很好的文章,可能会让你开始
祝你好运 如果你想找一个简单的@OneToMany,我喜欢Abd的回答 您可能不想强迫bean总是进行即时加载,而只想使用FETCH-JOIN样式将此概念合并到NamedNative查询中。使用这种方法,您可以对关联在其他方面是惰性的对象创建渴望的查询。在这种情况下,Hibernate只会急切地通过您的查询获取数据,而且通常是懒惰的,我认为这是大多数人想要的 随便用谷歌搜索一下。这是一篇写得很好的文章,可能会让你开始
祝你好运 要获取
FetchType.LAZY
是什么,您必须在句子中使用joinfetch
。当您使用JOIN
时,您将获得所有FetchType。EAGER
是,但不是FetchType。LAZY
是
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
}
@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
}
@OneToMany(fetch = FetchType.LAZY, mappedBy="empListBean")
private List<WorkListBean> workList;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="EMP_ID")
private EmpListBean empListBean;
刀
String hql=“选择empListBean”
+“来自EmpListBean EmpListBean”
+“加入获取empListBean.workList工作列表”
+“其中empListBean.id=:EMPID”;
Query q=sessionFactory.getCurrentSession().createQuery(hql);
q、 setParameter(“EMPID”,myObj.getEmpId());
List empListBean=query.List();
要获取FetchType.LAZY
是什么,您必须在句子中使用joinfetch
。当您使用JOIN
时,您将获得所有FetchType。EAGER
是,但不是FetchType。LAZY
是
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
}
@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
}
@OneToMany(fetch = FetchType.LAZY, mappedBy="empListBean")
private List<WorkListBean> workList;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="EMP_ID")
private EmpListBean empListBean;
刀
String hql=“选择empListBean”
+“来自EmpListBean EmpListBean”
+“加入获取empListBean.workList工作列表”
+“其中empListBean.id=:EMPID”;
Query q=sessionFactory.getCurrentSession().createQuery(hql);
q、 setParameter(“EMPID”,myObj.getEmpId());
List empListBean=query.List();
EmpListBean中的工作列表如何成为manytone
?它应该是OneToMany
Ya。我尝试了两种方法,即使我把一对多的问题存在。它仍然返回nullWell,您只获取ID,NAME
!为了说明这个问题,我只获取id和name,但在实际查询中,我获取了大量数据,而且在命名查询中也很少发生复杂的连接。您应该获取整个实体或执行dto投影。您试图做的是在实体本身上执行dto投影,并期望正确填写剩余字段,这是不正确的。在EmpListBean中工作列表
怎么可能是多通
?它应该是OneToMany
Ya。我尝试了两种方法,即使我把一对多的问题存在。它仍然返回nullWell,您只获取ID,NAME
!为了说明这个问题,我只使用id和name,但在实际查询中,我获取了大量数据,而且也很少有复杂的joi