【问题标题】:Hibernate get() method vs hql. which would be best approach?Hibernate get() 方法与 hql。哪个是最好的方法?
【发布时间】:2015-03-01 18:10:48
【问题描述】:

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

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

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

我的用例是,我需要根据 D 中不是主键的列值从表 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 个表创建一个字符串并传递给 create 查询方法。

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

我想知道:

  1. 有没有办法通过传递非主键列值来调用get方法
  2. 除了这些方法还有其他方法吗?
  3. 哪种方法更好

提前致谢。

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复和澄清
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多