1
我有一個簡單的模型,它只是一對多關係鏈:國家 - <城市 - <街道 表格被映射爲實體並作爲地圖返回。爲什麼Hibernate HQL能夠正常工作,但Criteria沒有?
下面的試驗方法是生產奇怪的結果:
public static void main(String[] args) {
Session session = HibernateSessionFactory.getSession();
List<Map<String, Object>> results = null;
//Query using HQL and print results
System.out.println("FROM HQL =====================");
String hql = "from Street where City.Country.countryid = 1";
Query query = session.createQuery(hql);
results = query.list();
for(Map<String, Object> row : results) {
System.out.println(row);
}
//Query using Criteria and print results
System.out.println("FROM CRITERIA ================");
Criteria criteria = session.createCriteria("Street");
criteria.add(Restrictions.eq("City.Country.countryid", 1));
results = criteria.list();
for(Map<String, Object> row : results) {
System.out.println(row);
}
}
它使用HQL的頂塊按預期方式工作,但底部塊翻倒:
輸出:
FROM HQL =====================
{streetname=Mayfair, [email protected], $type$=Street, streetid=1}
{streetname=Park Lane, [email protected], $type$=Street, streetid=2}
{streetname=Bond Street, [email protected], $type$=Street, streetid=3}
{streetname=Old Kent Road, [email protected], $type$=Street, streetid=4}
FROM CRITERIA ================
Exception in thread "main" org.hibernate.QueryException: could not resolve property: City.Country.countryid of: Street
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:67)
at org.hibernate.persister.entity.AbstractPropertyMapping.toColumns(AbstractPropertyMapping.java:82)
at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:54)
at org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1367)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:457)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumnsUsingProjection(CriteriaQueryTranslator.java:417)
at org.hibernate.criterion.SimpleExpression.toSqlString(SimpleExpression.java:68)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:357)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:113)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:82)
at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:91)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1578)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:306)
at com.bar.foo(Main.java:33)
我看不出爲什麼HQL可以解析City.Country.countryid,但是Criteria(Restrictions)不能。
我錯過了一些明顯的東西嗎?
謝謝! 我不能使用Street.class,因爲我沒有Street.class。在我的應用程序中一切都是動態然而,別名的使用似乎有所幫助。 對於「路徑」的每個部分,我可以創建一個別名,如下所示: criteria.createAlias(「City」,「ci」); (限制.eq(「co.countryid」,1); 這似乎工作。 – Memran