首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate标准查询:域对象设置的问题

Hibernate标准查询:域对象设置的问题
EN

Stack Overflow用户
提问于 2016-02-26 19:33:38
回答 2查看 477关注 0票数 0

我有一张表,它模仿下面的列结构。

ID,Harbor_Name,Country,Country_Code,State,State_Code,City

我有一个实体港口如下。

代码语言:javascript
复制
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 ---
}

我想从桌子上得到一个国家的名字。我尝试了下面的条件对象,并且遇到了如下所示的SQL异常。

代码语言:javascript
复制
    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生成和异常:

代码语言:javascript
复制
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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-26 20:41:14

这对我有用。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-02-26 20:24:14

尝试像这样修改您的标准:

代码语言:javascript
复制
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());
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35660171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档