2016-02-26 5 views
0

У меня есть таблица, которая имитирует приведенную ниже структуру столбца.Запрос на спящий режим: проблема с получением объекта объекта домена

ID, Harbor_Name, Страна, country_code, государство, state_code, Город

У меня есть объект Harbor, как показано ниже.

public class Harbor{ 
    private Long Id; 
    private String name; 
    private Address address; 
    -- getters and setters --- 
} 

Public class Address{ 
    private Country country; 
    private State state; 
    private String city; 
    -- getters and setters --- 
} 

Public class Country{ 
    private String name; 
    private String code; 
    -- getters and setters --- 
} 

Public class State{ 
    private String name; 
    private String code; 
    -- getters and setters --- 
} 

Я хотел получить Set из таблицы с указанием названия страны. Я попытался найти объект критериев, и я столкнулся с исключением SQL, как показано ниже.

public Set<State> getStatesByCountry(String countryName) { 
    Criteria criteria = this.sessionFactory.getCurrentSession().createCriteria(Harbor.class, "harbor"); 
     criteria.createAlias("harbor.address", "a"); 
     criteria.createAlias("a.country", "c"); 
     criteria.createAlias("a.state", "s"); 
     criteria.setProjection(Projections.distinct(Projections.property("s.name"))); 
     criteria.add(Restrictions.eq("c.name", countryName).ignoreCase()); 
     criteria.add(Restrictions.isNotNull("s.name")); 
     states.addAll(criteria.list()); 
} 

SQL Сформирован и исключение:

select distinct state3_.Harbor_Name as y0_ from HARBOR_DATA this_ where lower(country2_.Harbor_Name)=? and state3_.Harbor_Name is not null 

java.sql.SQLSyntaxErrorException: ORA-00904: "STATE3_"."Harbor_Name": invalid identifier 

<class name="sample.package.Harbor" table="Harbor_data" mutable="false"> 
     <id name="Id" column="ID"></id> 
     <property name="name" column="Harbor_Name" /> 
     <component name="address" class="sample.domain.Address"> 
      <property name="city" column="City" /> 
      <component name="state" class="sample.domain.State"> 
       <property name="code" column="State_Code" /> 
       <property name="name" column="State" /> 
      </component> 
      <component name="country" class="sample.domain.Country"> 
       <property name="name" column="Country" /> 
       <property name="code" column="Country_Code" /> 
      </component> 
     </component> 
    </class> 
+0

У вас есть все 3 объекта, сопоставленные с одной таблицей? – WeMakeSoftware

+0

Да .. Я сделал это таким образом, чтобы использовать существующий адрес домена, страну и состояние. – minion

+0

Как вы сопоставляете сущности с именами столбцов? используя XML или аннотации? – WeMakeSoftware

ответ

0

Это работает для меня.

public Set<State> getStatesByCountry(String countryName) { 
    Criteria criteria = this.sessionFactory.getCurrentSession().createCriteria(Harbor.class, "harbor"); 
    criteria.setProjection(Projections.distinct(Projections.property("harbor.address.state.name"))); 
     criteria.add(Restrictions.eq("harbor.address.country.name", countryName).ignoreCase()); 
     criteria.add(Restrictions.isNotNull("harbor.address.state.name")); 
     states.addAll(criteria.list()); 
} 
0

Попробуйте изменить критерии, как это:

Criteria criteria = this.sessionFactory.getCurrentSession().createCriteria(Harbor.class, "harbor"); 
     criteria.createAlias("harbor.address", "a"); 
     criteria.createAlias("a.country", "c"); 
     criteria.createAlias("a.state", "s"); 

     //note I've changed projection property to harbor name 
     criteria.setProjection(Projections.distinct(Projections.property("harbor.name"))); 
     criteria.add(Restrictions.eq("c.name", countryName).ignoreCase()); 
     criteria.add(Restrictions.isNotNull("s.name")); 
     states.addAll(criteria.list()); 
} 
+0

Эй, спасибо за то, что он ударил. Это новое обучение для меня. – minion