簡體   English   中英

為什么Hibernate HQL有效,但Criteria不起作用?

[英]Why does Hibernate HQL work, but Criteria does not?

我有一個簡單的模型,它只是一對多關系的鏈:國家-<城市-<街道表被映射為實體,並作為Map返回。

以下測試方法產生奇怪的結果:

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, City=org.hibernate.proxy.map.MapProxy@2b12e7f7, $type$=Street, streetid=1}
{streetname=Park Lane, City=org.hibernate.proxy.map.MapProxy@2b12e7f7, $type$=Street, streetid=2}
{streetname=Bond Street, City=org.hibernate.proxy.map.MapProxy@663b1f38, $type$=Street, streetid=3}
{streetname=Old Kent Road, City=org.hibernate.proxy.map.MapProxy@663b1f38, $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,但條件(限制)無法解析。

我是否缺少明顯的東西?

因為您為hql查詢使用了錯誤的語法。 幾個故障:

  • Street.class而不是“ Street”
  • 別名缺失
  • 直接使用country代替country.id

嘗試這個:

Criteria criteria = session.createCriteria(Street.class)
.createAlias("city", "ci")
.add(Restrictions.eq("ci.country", country))

有關更多詳細信息,請參見休眠參考

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM