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

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

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

考虑以下场景: A、B、C、D 是四个 table,它们之间有一对多映射。

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

我的用例是,我需要根据 D 中的列值从 table A 获取数据,该列值不是主键 .

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

方法一:使用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: 使用休眠查询和连接 通过连接所有 4 个 table 来创建一个字符串并传递给创建查询方法。

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

我想知道:

  1. Is there a way to call get method by passing non primary key column value
  2. apart from these approach is there any other approach?
  3. which is better approach

提前致谢。

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

不过,效率并不是唯一重要的事情。但是由于无论如何你都需要编写一个查询来获取 D,所以我会编写查询来获取所需的信息。

请注意您的第一个策略:

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

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

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

或更好,因为查询应该return单个实体

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

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