2012-08-30 73 views
0

假设我创建一个使用Hibernate的一个标准:Hibernate何时为Subcriterias创建别名?

Session session = (Session) entityManager.getDelegate(); 
Criteria rootCriteria = session.createCriteria(entityClass); 

如果我不设置别名明确Hibernate将使用"this"作为别名(我检查出来,它是硬编码到CriteriaImpl

如果。我创造这一个子标准:

Criteria subCriteria = rootCriteria.createCriteria(associationPath, CriteriaSpecification.LEFT_JOIN); 

休眠创建子标准的一个实例,这是一个内部类的CriteriaImpl,并没有分配阿里就这个过程而言。

如果我运行查询,然后检查我的SQL日志,我可以看到Hibernate为它创建了一个别名,但只有当我运行查询时。因为我想使用这个Subcriteria将限制添加到我的查询中,如果我为我生成了别名,那将会很好。有没有办法让Hibernate生成别名,或者我必须将它们传递给工厂方法?

回答

2

通常是个createCriteria无需链接限制时所使用的别名

Criteria crit = session.createCriteria(Order.class) 
    .createCriteria("Items") 
     .add(Restrictions.gt("count", 1)) 
     .add(Restrictions.gt("price", 10)) 
    .list(); 

使用会产生

SELECT * FROM orders o join items i ON ... WHERE i.count > 1 and i.price > 10 

用别名,它看起来像

Criteria crit = session.createCriteria(Order.class) 
    .createAlias("Items", "item") 
    .add(Restrictions.gt("item.count", 1)) 
    .add(Restrictions.gt("item.price", 10)) 
    .list();