hibernate实体中带有@namednativequeries的实体列表

llycmphe  于 2021-07-23  发布在  Java
关注(0)|答案(4)|浏览(340)

我有一种情况,我得到了hiberate中的实体列表,但在主实体中我有另一个实体列表。我使用的实体:
emplistbean.java文件

  1. @NamedNativeQueries({
  2. @NamedNativeQuery(
  3. name = "EmpList",
  4. //Actual query involves lot of joins
  5. query = " SELECT ID , NAME FROM EMPLOYEE WHERE EMP_ID=:EMPID"
  6. ,resultClass = EmpListBean.class
  7. )
  8. })
  9. @Entity
  10. public class EmpListBean {
  11. @Column(name = "ID")
  12. private int id;
  13. @Column(name = "NAME")
  14. private String empName;
  15. // This is the list i need to retreive
  16. @ManyToOne
  17. @Column(name="workList")
  18. private List<WorkListBean> workList;
  19. //Getters & Setters
  20. }

worklistbean.java文件

  1. @NamedNativeQueries({
  2. @NamedNativeQuery(
  3. name = "WorkListBeanList",
  4. query = " SELECT ID , NAME FROM Work_List WHERE EMP_ID=:EMPID"
  5. ,resultClass = WorkListBean.class
  6. )
  7. })
  8. @Entity
  9. public class WorkListBean {
  10. @Column(name = "ID")
  11. private int id;
  12. @Column(name = "NAME")
  13. private String workName;
  14. //Getters & Setters
  15. }

道层

  1. Query query = session.getNamedQuery("EmpList");
  2. query.setParameter("EMPID", myObj.getEmpId());
  3. List<EmpListBean> oEmpListBean = query.list();

在执行dao层以下的代码时,我得到的“worklist”对象是空的,我知道这可以通过分别迭代emplistbean和分别调用worklistbean的named query来实现,但是由于数据量很大,这样做会花费太多时间,所以我想知道是否有任何方法可以在emplistbean中获取worklistbean。这里使用的两个实体仅供参考,我使用的实际查询很复杂,无法在本论坛中显示,并且它涉及许多表连接,因此请让我知道如何在hibernate中实现这一点。

zbq4xfa0

zbq4xfa01#

我知道这可以通过分别迭代emplistbean和分别调用worklistbean的named query来实现,但是由于数据量很大,这样做需要花费太多时间
我知道您想合并这两个查询以包含两个实体的数据,那么?
一旦 EmpListBean 以及 WorkListBean 正确定义,即:

  1. class EmpListBean {
  2. ...
  3. @OneToMany
  4. @JoinColumn(name = "EMP_ID")
  5. private List<WorkListBean> workList;
  6. }

您应该能够使用以下方法:

  1. session.createNativeQuery(
  2. "SELECT employee.* FROM EMPLOYEE employee JOIN Work_List wl JOIN ... WHERE wl.EMP_ID=emp.id AND employee.EMP_ID=:EMPID AND ..." )
  3. .addEntity("employee", EmpListBean.class )
  4. .addJoin( "wl", "employee.workList")
  5. .setResultTransformer( Criteria.ROOT_ENTITY )
  6. .list();

但是,不确定它是否适用于命名本机查询,您需要检查。

展开查看全部
dddzy1tm

dddzy1tm2#

正如@javalerner所评论的,您应该使用@onetomany并使用fetch=“fetchtype.eager”添加eager-loading
并删除列注解

  1. @OneToMany(fetch = FetchType.EAGER)
  2. private List<WorkListBean> workList;
kyxcudwk

kyxcudwk3#

如果你想找一个简单的@onetomany,我喜欢abd的回答。
与其强迫bean总是急切地加载,不如使用fetch-join样式将这个概念合并到namednative查询中。使用这种方法,您可以创建对其关联在其他方面是惰性的对象的急切查询。在这种情况下,hibernate只会急切地通过您的查询获取数据,而且通常是懒惰的,我认为这是大多数人想要的。
随便用谷歌搜索一下。这是一篇写得很好的文章,也许能让你开门见山。
http://www.basilv.com/psd/blog/2008/improving-performance-via-eager-fetching-in-hibernate
祝你好运!

aor9mmx1

aor9mmx14#

得到任何东西 FetchType.LAZY 是的,你必须使用 JOIN FETCH 在句子里。当你使用 JOIN 你什么都有 FetchType.EAGER 但不是什么 FetchType.LAZY
emplistbean.java文件

  1. @OneToMany(fetch = FetchType.LAZY, mappedBy="empListBean")
  2. private List<WorkListBean> workList;

worklistbean.java文件

  1. @ManyToOne(fetch = FetchType.LAZY)
  2. @JoinColumn(name="EMP_ID")
  3. private EmpListBean empListBean;

  1. String hql = "SELECT empListBean "
  2. + "FROM EmpListBean empListBean "
  3. + "JOIN FETCH empListBean.workList workList "
  4. + "WHERE empListBean.id = :EMPID";
  5. Query q = sessionFactory.getCurrentSession().createQuery(hql);
  6. q.setParameter("EMPID", myObj.getEmpId());
  7. List<EmpListBean> empListBean = query.list();
展开查看全部

相关问题