我想了解hibernate是如何在内部或其他模型中执行hql查询的,hql查询引擎是如何工作的。请建议一些相同的好的链接?
阅读的原因之一是下面的问题。
Class Branch
{
//lazy loaded
@joincolumn(name="company_id")
Company company;
} 因为company是重对象,所以它是惰性加载的。
现在我有了hql查询
"from Branch as branch where branch.Company.id=:companyId"我担心的是,如果要触发上面的查询,hql引擎必须检索公司对象,那么它会影响性能,我更喜欢在分支类中添加一个属性,即companyId。因此,在这种情况下,hql查询将为
"from Branch as branch where branch.companyId=:companyId"如果hql引擎首先从hql生成sql,然后触发sql查询本身,那么应该不会有性能问题。
如果问题无法理解,请让我知道。
发布于 2010-12-27 12:17:17
我担心的是,如果要触发上面的查询,hql引擎必须检索公司对象,那么它的性能将命中
由于您只想使用公司标识符(在普通的SQL语言中,单个外键),因此Hibernate engine 足够智能,可以使用公司外键而无需加载公司实体
但是...
它只在使用属性访问策略时起作用。另一方面,您必须通过将每个与JPA相关的注释放在getter方法的正上方(而不是字段-如示例所示)来设置您的实体。之所以会发生这种情况,是因为Hibernate在幕后通过将实体子类化来利用代理。例如,如果您使用由名为userName的属性封装的名为id的字段(是的,这是可能的),例如
@Id
private String id;
public String getUserName() { return this.id; }
public void setUserName(String userName) { this.id = userName; }因为Hibernate用来管理实体的逻辑被放在它的子类属性中,所以Hibernate如何假设userName属性封装了一个名为id的字段?
因此,如果您希望避免加载公司,则应改为使用属性访问策略。
https://stackoverflow.com/questions/4535721
复制相似问题