Hibernate何时为Subcriterias创建别名?

时间:2012-08-30 13:59:15

标签: java hibernate hibernate-criteria

假设我使用Hibernate创建一个Criteria:

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

如果我没有明确设置别名,Hibernate将使用"this"作为别名(我签出并将其硬编码到CriteriaImpl类中。

如果我为此创建子标准:

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

Hibernate创建了一个Subcriteria实例,它是CriteriaImpl的内部类,并且在此过程中没有为它指定别名。

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

1 个答案:

答案 0 :(得分: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();