gpt4 book ai didi

java - Hibernate get() 方法与 hql 方法。哪个是最好的方法?

转载 作者:行者123 更新时间:2023-12-01 11:51:26 24 4
gpt4 key购买 nike

我试图了解以下用例的最佳解决方案。任何输入都会非常有帮助。

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

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

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

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

方法 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);

我想知道:

  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

提前致谢。

最佳答案

使用专用查询直接返回所需数据当然比执行查询查找 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。这些是不同的语言。

关于java - Hibernate get() 方法与 hql 方法。哪个是最好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28797148/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com