[英]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);
我想知道:
- 有没有一种方法可以通过传递非主键列值来调用get方法
- 除了这些方法,还有其他方法吗?
- 哪种方法更好
提前致谢。
当然,使用专用查询直接返回所需数据要比执行查询来查找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.