我正在尝试了解以下用例的最佳解决方案。任何输入都会非常有用。
请考虑以下情形: 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);
我想知道:
- 有没有办法通过传递非主键列值
来调用get方法- 除了这些方法还有其他方法吗?
- 这是更好的方法
醇>
提前致谢。
答案 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。那些是不同的语言。