HQL和连接 - 更快的方法?

时间:2015-08-14 08:42:38

标签: java performance hibernate join hql

我的模型的这一部分如下:

IQCEntity has many Documents
DocumentCategory has many Documents

我正在为我的ORM使用Hibernate。

现在,请考虑以下方法:

/**
 * Get all documents in the supplied IQCEntity which are in the
 * specified DocumentCategory.
 * @param entity the {@link IQCEntity} which holds the Documents
 * @param category the {@link DocumentCategory} which the Documents belong to
 * @return Collection<{@link Document}>
 */
@SuppressWarnings("unchecked")
public Collection<Document> getDocuments(IQCEntity entity, DocumentCategory category) { 
    String q = "from Document d where d.documentCategory.documentCategoryId = :c and d.entity.entityId = :e";
    Query query = session.createQuery(q);
    query.setParameter("c", category.getDocumentCategoryId());
    query.setParameter("e", entity.getEntityId());
    List<Document> documents = (List<Document>)query.list();
    Collections.sort(documents);
    return documents;
}

此方法有效,并带回正确的结果,但似乎相当慢。

如果我查看数据库中的表结构,Document表中有父ID(当然它确实如此 - 否则它如何加入!),documentCategory_documentCategoryIdentity_entityId

我们都知道在SQL中可以实现正确的结果而不需要任何连接。如何在HQL中完成同样的工作?

我试过这个:(注意_而不是。)

String q = "from Document d where d.documentCategory_documentCategoryId = :c and d.entity_entityId = :e";

但找不到该属性。

org.hibernate.QueryException: could not resolve property: documentCategory_documentCategoryId of: com.foo.bar.entities.Document

有没有办法引用连接字段而不是对象引用?

1 个答案:

答案 0 :(得分:3)

要避免加入,请使用identifier property .id

String q = "from Document d where d.documentCategory.id = :c and d.entity.id = :e";

但是,由于您还有引用的对象,您甚至可以使用entitycategory作为参数来编写更短的版本:

String q = "from Document d where d.documentCategory = :c and d.entity = :e";
Query query = session.createQuery(q);
query.setParameter("c", category);
query.setParameter("e", entity);

在这两个版本中,Hibernate都能够确定它实际上不需要加入。