This one time, at band camp, Keld Helbig Hansen said:
KHH>Sometimes I get QueryResults.size=2 on a query, but there's only one object in
QueryResults.
KHH>E.g.
KHH> query = db.getOQLQuery("SELECT a FROM hansen.playground.Actor a WHERE
a.name=$1");
KHH> query.bind("Keanu Reeves");
KHH>This should only return one object, but QueryResults.size() is 2.
KHH>If I fetch the first object, QueryResults.hasMore() however returns false.
KHH>
KHH>There is a many-to-many relation from actor to movie, and Castor generates an SQL
statement like this:
KHH>
KHH>SELECT actor.id,actor.name,actor_movie.id_movie FROM actor LEFT OUTER JOIN
actor_movie ON actor.id=actor_movie.id_actor WHERE (actor.name = ?)
KHH>
KHH>I'd say that size=2 is wrong. What's the explanation?
Keld,
Actually, the size() method on the QueryResults seems to be broken
at times due to the way that Castor JDO queries and loads objects.
Here is a quick description from the author of the size() method,
Matthew Baird:
-------------------------------------------------------------------------------
If you have an object model that has a one to many where the queried class
is the one, then you will get the wrong number of results reported
by .size().
The reason is Castor builds the queries in a way to try and load all the
results at once, then there is code in castor that looks at the
change in the resultset to know when to switch the object it's creating.
A diagram is probably more useful:
foo has many bar's
foo has id, code, name
bar has id, age, date
So a query to get all foo's will end up returning a resultset like this:
FOO.ID FOO.CODE FOO.NAME BAR.ID BAR.AGE BAR.DATE
------ -------- ------------ ------ ------- --------
1 abc somefoo 123 3 1/1/2001
1 abc somefoo 124 8 1/1/2002
1 abc somefoo 532 1 2/4/2001
2 def someotherfoo 828 .05 6/6/1999
2 def someotherfoo 999 3 1/1/2002
So that represents foo (1) having 3 related bar's and foo(2)
having 2 related bar's. Castor looks at the change in bar.id
as it scrolls through the resultset in order to change from
building foo(1) to foo(2). This get's even more hairy when bar
participates in a 1:M as well as foo. In this case, .size()
will return 5 instead of 2 because it just goes to the end get's
the rowcount then pops back to the front.
-------------------------------------------------------------------------------
HTH.
Bruce
--
perl -e 'print unpack("u30","<0G)[EMAIL PROTECTED]&5R\"F9E<G)E=\$\!F<FEI+F-O;0\`\`");'
-----------------------------------------------------------
If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-dev