Hibernate get()方法vs hql。哪种方法最好?

时间:2015-03-01 18:10:49

标签: java hibernate hql

我正在尝试了解以下用例的最佳解决方案。任何输入都会非常有用。

请考虑以下情形: A,B,C,D是四个表,它们之间有一对多的映射。

A --> B --> C --> D
A (One) --> B (Many) and so on..

我的用例是,我需要根据 D中不是主键的列值来获取表A中的数据。

根据我的理解(对Hibernate还是新手,所以如果我错了请纠正我:)),有2种方法

方法1:使用get()方法 首先使用hibernate Query获取主键值,然后调用get方法

Query query = sessionFactory.getCurrentSession().createQuery("from D where ...");

Int id = query.list().get(0).getId();
this.sessionFactory.getCurrentSession().get(id);

方法2:使用hibernate查询和连接 通过连接所有4个表创建一个字符串并传递给创建查询方法。

Query query = sessionFactory.getCurrentSession().createQuery(sql);

我想知道:

  
      
  1. 有没有办法通过传递非主键列值
  2. 来调用get方法   
  3. 除了这些方法还有其他方法吗?
  4.   
  5. 这是更好的方法
  6.   

提前致谢。

1 个答案:

答案 0 :(得分:1)

使用专用查询直接返回所需数据当然会更有效的是执行查询以查找D,然后从D中获取C,从C中获取B,最后从B中获取A.特别是如果关联是惰性的。 / p>

效率并不是唯一重要的事情。但是既然你需要编写一个查询来获取D,我会编写查询来获取想要的信息。

请注意您的第一个策略:

int id = query.list().get(0).getId();
D d = (D) this.sessionFactory.getCurrentSession().get(id);

第二行完全没用。它将返回查询已找到的实体。你所需要的只是

D d = (D) query.list().get(0);

或更好,因为查询应返回单个实体

D d = (D) query.uniqueResult();

另外,传递给createQuery()的不是SQL。这是HQL。那些是不同的语言。