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);
我想知道:
- Is there a way to call get method by passing non primary key column value
- apart from these approach is there any other approach?
- 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。这些是不同的语言。
我正在尝试了解以下用例的最佳解决方案。任何输入都会很有帮助。
考虑以下场景: 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);
我想知道:
- Is there a way to call get method by passing non primary key column value
- apart from these approach is there any other approach?
- 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。这些是不同的语言。