-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: Different data set is returned depending on the fetch mode
PostPosted: Thu Oct 06, 2005 11:09 am 
Beginner
Beginner

Joined: Tue Aug 23, 2005 3:52 pm
Posts: 26
Hibernate version: 3.0.5


While executing the same HQL I get a different data set depending if I use join or subselect fetch.

Mapping:

Code:
<class table="brokers" name="Counterparty" mutable="false">
    <id name="code" type="integer" column="broker_code"/>   
    <set name="desks" fetch="subselect" lazy="false">
        <key column="broker_code"/>
        <one-to-many class="Desk"/>         
   </set>   
   <set name="settlementInstructions" fetch="subselect" lazy="false">
        <key column="broker_code"/>
        <one-to-many class="SettlementInstruction"/>
   </set>
</class>

<class table="sub_brokers" name="Desk" mutable="false">
    <composite-id name="id"  class="Desk$Id">
        <key-property name="brokerCode" type="integer" column="broker_code"/>
        <key-property name="subBrokerCode" type="string" column="sub_broker_code"/>
     </composite-id>   
     <property name="entity" type="integer" column="entity"/>
</class>

<class table="broker_routing" name="SettlementInstruction" mutable="false">     
    <id name="settleCode" type="integer" column="settle_code"/>       
    <property name="brokerCode" type="integer" column="broker_code"/>
    <property name="entity" type="integer" column="entity"/>
  </class>


DB:

Code:
Table: brokers         
broker_code
1
2
3

Table: sub_brokers
broker_code   sub_broker_code       entity
1                    a                  1
1                    b                 -1



Table: broker_routing
settle_code      brokerCode       entity
5                    1             1
6                    1            -1



USING JOIN FETCH
___________________________________________________________


HQL using join fetch

Code:
select distinct b from Counterparty b  join fetch b.desks d left join fetch b.settlementInstructions s where d.entity >= 0  and s.entity >= 0


Resulting SQL

Code:
select distinct counterpar0_.broker_code as broker1_0_, desks1_.broker_code as broker1_1_,
        desks1_.sub_broker_code as sub2_1_, settlement2_.settle_code as settle1_2_,
        desks1_.entity as entity1_1_, desks1_.broker_code as broker1_0__,
        desks1_.sub_broker_code as sub2_0__, settlement2_.broker_code as broker2_2_2_,
        settlement2_.entity as entity2_2_, settlement2_.broker_code as broker2_1__,
        settlement2_.settle_code as settle1_1__
from externdb.dbo.brokers counterpar0_
inner join externdb.dbo.sub_brokers desks1_ on counterpar0_.broker_code=desks1_.broker_code
left outer join externdb.dbo.broker_routing settlement2_ on counterpar0_.broker_code=settlement2_.broker_code
where desks1_.entity>=0 and settlement2_.entity>=0



Resulting Objects

Counterparty (code =1)
    Desk (brokerCode =1, subBrokerCode =a, entity=1)
    SettlementInstruction(brokerCode=1, settleCode=5, entity=1)


USING SUBSELECT FETCH
___________________________________________________________



HQL using subselect fetch

Code:
select distinct b from Counterparty b  join b.desks d left join b.settlementInstructions s where d.entity >= 0  and s.entity >= 0


Resulting SQL

Code:
select distinct counterpar0_.broker_code as broker1_
from externdb.dbo.brokers counterpar0_
inner join externdb.dbo.sub_brokers desks1_ on counterpar0_.broker_code=desks1_.broker_code
left outer join externdb.dbo.broker_routing settlement2_ on counterpar0_.broker_code=settlement2_.broker_code
where desks1_.entity>=0 and settlement2_.entity>=0


select settlement0_.broker_code as broker2_1_, settlement0_.settle_code as settle1_1_,
       settlement0_.settle_code as settle1_0_, settlement0_.broker_code as broker2_2_0_,
       settlement0_.entity as entity2_0_
from externdb.dbo.broker_routing settlement0_
where settlement0_.broker_code in (select counterpar0_.broker_code
                                   from externdb.dbo.brokers counterpar0_
                                   inner join externdb.dbo.sub_brokers desks1_ on counterpar0_.broker_code=desks1_.broker_code
                                   left outer join externdb.dbo.broker_routing settlement2_ on counterpar0_.broker_code=settlement2_.broker_code
                                   where desks1_.entity>=0 and settlement2_.entity>=0)

select desks0_.broker_code as broker1_1_, desks0_.sub_broker_code as sub2_1_, desks0_.broker_code as broker1_0_,
        desks0_.sub_broker_code as sub2_0_, desks0_.entity as entity1_0_
from externdb.dbo.sub_brokers desks0_
where desks0_.broker_code in (select counterpar0_.broker_code
                              from externdb.dbo.brokers counterpar0_
                              inner join externdb.dbo.sub_brokers desks1_ on counterpar0_.broker_code=desks1_.broker_code
                              left outer join externdb.dbo.broker_routing settlement2_ on counterpar0_.broker_code=settlement2_.broker_code
                              where desks1_.entity>=0 and settlement2_.entity>=0)



Resulting Objects

Counterparty (code =1)
    Desk(brokerCode =1, subBrokerCode =a, entity=1)
    Desk (brokerCode =1, subBrokerCode =b, entity=-1)
    SettlementInstruction(brokerCode=1, settleCode=5, entity=1)
    SettlementInstruction(brokerCode=1, settleCode=6, entity=-1)

As you can see Hibernate uses “where” clause differently depending on fetch mode. As far as I understand fetch mode controls how the data is retrieved not what data is retrieved. Two identical queries should return same data regardless of the fetch mode. Can anyone please shine some light on this?

Sorry for the long post.
Regards,
Leonid


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.