Search code examples
hibernatehibernate-mappinghibernate-criteria

Hibernate criteria createalias method generate additional select query


Hibernate createalias() method is used to create the joins. When I am calling s.iterator() method hibernate is generating another select query to get the child record? As per my understanding it generates the single select query to get the both parent and child records using join.

Criteria ct = sn.createCriteria(Vendor.class);      
Criteria ct1= ct.createAlias("children", "cust");   
List<Vendor> l = ct.list();
Iterator<Vendor> i = l.iterator();
while (i.hasNext()) {
    Vendor v = (Vendor) i.next();
    System.out.println("name " + v.getVendorname());
    Set<Customer> s = v.getChildren();
    Iterator<Customer> it = s.iterator();
    while (it.hasNext()) {
        Customer c = it.next();
        System.out.println("custname " + c.getCustomername());
    }
}

Mapping files:

<hibernate-mapping>
    <class name="com.criteria.example.Customer" table="customer">
        <id name="customerid" column="cid">
            <generator class="native" />
        </id>
        <property name="customername" type="string">
            <column name="cname" length="10" not-null="true" />
        </property>
    </class>
</hibernate-mapping>
<hibernate-mapping>
    <class name="com.criteria.example.Vendor" table="vendor">
        <id name="vendorid" column="vid">
            <generator class="native" />
        </id>
        <property name="vendorname" type="string">
            <column name="vname" length="10" not-null="true" />
        </property>
        <set name="children" inverse="false" cascade="all" lazy="false">
            <key column="vendid" not-null="true" />
            <one-to-many class="com.criteria.example.Customer" />
        </set>
    </class>
</hibernate-mapping>

Solution

  • After many searches on google finally I have got an answer to this question. Generating additional queries is a bug in hibernate.