Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hibernate实体中具有@NamedNativeRequesties的实体列表_Java_Spring_Spring Boot_Hibernate_Jpa - Fatal编程技术网

Java hibernate实体中具有@NamedNativeRequesties的实体列表

Java 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

我有一种情况,我在Hibrate中得到一个实体列表,但在主实体中我有另一个实体列表。我使用的实体:

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;
道层

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