首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >hql查询触发模型?

hql查询触发模型?
EN

Stack Overflow用户
提问于 2010-12-27 06:48:04
回答 1查看 519关注 0票数 1

我想了解hibernate是如何在内部或其他模型中执行hql查询的,hql查询引擎是如何工作的。请建议一些相同的好的链接?

阅读的原因之一是下面的问题。

代码语言:javascript
复制
    Class Branch
    {

          //lazy loaded
          @joincolumn(name="company_id")
          Company company;
    } 

因为company是重对象,所以它是惰性加载的。

现在我有了hql查询

代码语言:javascript
复制
       "from Branch as branch where branch.Company.id=:companyId"

我担心的是,如果要触发上面的查询,hql引擎必须检索公司对象,那么它会影响性能,我更喜欢在分支类中添加一个属性,即companyId。因此,在这种情况下,hql查询将为

代码语言:javascript
复制
    "from Branch as branch where branch.companyId=:companyId"

如果hql引擎首先从hql生成sql,然后触发sql查询本身,那么应该不会有性能问题。

如果问题无法理解,请让我知道。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-27 12:17:17

我担心的是,如果要触发上面的查询,hql引擎必须检索公司对象,那么它的性能将命中

由于您只想使用公司标识符(在普通的SQL语言中,单个外键),因此Hibernate engine 足够智能,可以使用公司外键而无需加载公司实体

但是...

它只在使用属性访问策略时起作用。另一方面,您必须通过将每个与JPA相关的注释放在getter方法的正上方(而不是字段-如示例所示)来设置您的实体。之所以会发生这种情况,是因为Hibernate在幕后通过将实体子类化来利用代理。例如,如果您使用由名为userName的属性封装的名为id的字段(是的,这是可能的),例如

代码语言:javascript
复制
 @Id
 private String id;

 public String getUserName() { return this.id; }
 public void setUserName(String userName) { this.id = userName; }

因为Hibernate用来管理实体的逻辑被放在它的子类属性中,所以Hibernate如何假设userName属性封装了一个名为id的字段?

因此,如果您希望避免加载公司,则应改为使用属性访问策略。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4535721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档