0

Im new to java and hibernate.

ExpenseType.java

public class ExpenseType extends BaseDomain {
  private int companyId;
  private String name;
  private String description;
  private Company company;

  // Getters and Setters
}


Company.java

public class Company extends BaseDomain {
  private String name;
  private String address;
  private String contactNumber;
  private String emailAddress;

  // Getters and Setters
}

I have 2 ojects ExpenseType and Company. They have a many-to-one relationship. The mapping is in this file expenseType.hbm.xml.

expenseType.hbm.xml

<hibernate-mapping>
   <class name="bp.ar.domain.hibernate.ExpenseType" table="EXPENSE_TYPE">   
      .
      .
      <property name="companyId">
        <column name="COMPANY_ID"/>
      </property>

      <many-to-one name="company" class="bp.ar.domain.hibernate.Company" fetch="select" insert="false" update="false" lazy="false">
        <column name="COMPANY_ID" not-null="true" />
      </many-to-one>
   </class>
</hibernate-mapping>

I have COMPANY_ID foreign key in my ExpenseType table.

In my implementation in the file ExpenseTypeDaoImpl.java I do something like

@Override
public Collection<ExpenseType> getAll(int companyId, Collection<Company> companies,
     ExpenseTypeField orderBy) {
  DetachedCriteria dc = getDetachedCriteria();
  dc.addOrder(Order.asc("company"));
  dc.addOrder(Order.asc(orderBy.name()));
  return getAll(dc);
}

What I really want to happen is that the result for ExpenseType will be ordered based on the company name. What happens with code above is that it orders the ExpenseType based on tbe COMPANY_ID. I tried to use dc.addOrder(Order.asc("company.name")); but I get an error.

I have this error:

org.hibernate.QueryException: could not resolve property: company.name of: bp.ar.domain.hibernate.ExpenseType

Please help. Thanks in advance.

4

1 回答 1

2

You need to create an alias to the relation before you can sort on its properties. This is analogous to a SQL JOIN.

DetachedCriteria dc = getDetachedCriteria();
dc.createAlias("company", "company");
dc.addOrder(Order.asc("company.name"));
return getAll(dc);
于 2012-04-26T00:24:31.377 回答