2012-08-30 28 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();