Chintan Patel
Chintan Patel

Reputation: 739

HQL with one-to-many relationship is giving "ORA-00936: missing expression" exception

I have 2 tables with One-To-Many relationship as per following:

Table Relationship

My entity classes and hbm configurations are as per following:

AuditDetail.java

public class AuditDetail implements Serializable {

    private static final long serialVersionUID = 1L;
    private String auditId;
    private Timestamp startTime;
    private Timestamp endTime;
    Set auditParameterDataSet;

    public Set getAuditParameterDataSet() {
        return auditParameterDataSet;
    }
    public void setAuditParameterDataSet(Set auditParameterDataSet) {
        this.auditParameterDataSet = auditParameterDataSet;
    }
    public String getAuditId() {
        return auditId;
    }
    public void setAuditId(String auditId) {
        this.auditId = auditId;
    }
    public void setStartTime(Timestamp startTime) {
        this.startTime = startTime;
    }
    public Timestamp getEndTime() {
        return  endTime;        
    }
    public void setEndTime(Timestamp endTime) {
        this.endTime = endTime;
    }   
}

AuditDetail.hbm.xml

<hibernate-mapping>

    <class name="com.test.AuditDetail" table="AUDITDETAIL" >          

        <id name="auditId" column="AUDITID" type="string" />

         <property name="startTime" type="java.sql.Timestamp">
              <column name="STARTTIME" sql-type="VARCHAR2(50)" />
         </property>

         <property name="endTime" type="java.sql.Timestamp">
              <column name="ENDTIME" sql-type="VARCHAR2(50)" />
         </property>

        <set name="auditParameterDataSet" cascade="all,delete-orphan" lazy="true" inverse="true">
            <key>
                <column name="AUDITID"/>
            </key>
            <one-to-many class="com.test.AuditParameter" />
        </set>

    </class>

</hibernate-mapping>

AuditParameter.java

public class AuditParameter {

    private String auditId ;
    private String parameterId;
    private String fieldName ;
    private AuditDetail auditDetail;

    public String getAuditId() {
        return auditId;
    }
    public void setAuditId(String auditId) {
        this.auditId = auditId;
    }
    public String getParameterId() {
        return parameterId;
    }
    public void setParameterId(String parameterId) {
        this.parameterId = parameterId;
    }
    public String getFieldName() {
        return fieldName;
    }
    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }
    public AuditDetail auditDetail() {
        return auditDetail;
    }
    public void setAuditDetail(AuditDetail auditDetail) {
        this.auditDetail = auditDetail;
    }

}

AuditParameter.hbm.xml

<hibernate-mapping>

    <class name="com.test.AuditParameter" table="AUDITPARAMETER" >          

         <id name="parameterId" type="string">
              <column name="PARAMETERID" sql-type="VARCHAR2(50)"  />
        </id>

        <many-to-one name="auditDetail" class="com.test.AuditDetail" column="AUDITID" insert="false" update="false" lazy="false">
        </many-to-one>

        <property name="auditId" type="string">
              <column name="AUDITID" sql-type="VARCHAR2(50)" not-null="false" />
        </property>

        <property name="fieldName" type="string">
              <column name="FIELDNAME" sql-type="VARCHAR2(50)" />
        </property>


    </class>
</hibernate-mapping>

My hql query is a per following:

select a.auditId, a.startTime, a.endTime, a.auditParameterDataSet from AuditDetail a;

But when I execute this query, it gives me following error:

ORA-00936: missing expression

Following is my console output of query fired.

select au0_.AUDITID as col_0_0_, au0_.STARTTIME as col_1_0_, au0_.ENDTIME as col_2_0_, . as col_3_0_ 
from AUDITDETAIL au0_ inner join AUDITPARAMETER auditparam4_ on au0_.AUDITID=auditparam4_.AUDITID

As per this output we can see that hibernate is not generating column name for a.auditParameterDataSet. Why this is happening? Where I am doing wrong?

Upvotes: 3

Views: 2564

Answers (1)

karim mohsen
karim mohsen

Reputation: 2254

You have to use join :-

HQL:-

select a.auditId, a.startTime, a.endTime, auditParameterDataSet from AuditDetail join a.auditParameterDataSet auditParameterDataSet;

Criteria:-

Criteria criteria = session.createCriteria(AuditDetail.class);
criteria.setFetchMode("auditParameterDataSet", FetchMode.EAGER);

Upvotes: 4

Related Questions