繁体   English   中英

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

[英]Hibernate get() method vs hql. which would be best approach?

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

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

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

我的用例是,我需要基于表D中的列值(不是主键)从表A中获取数据。

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

方法1:使用get()方法首先使用休眠查询获取主键值,然后调用get方法

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

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

方法2:使用休眠查询和联接通过联接所有4个表来创建字符串,然后传递给create query方法。

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

我想知道:

  1. 有没有一种方法可以通过传递非主键列值来调用get方法
  2. 除了这些方法,还有其他方法吗?
  3. 哪种方法更好

提前致谢。

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

效率并不是唯一重要的事情。 但是由于您仍然需要编写查询以获取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。 这些是不同的语言。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM