Thanks for clarifying.
Bug number is 332994.
On 12/21/2010 12:50 AM, Tom Ware wrote:
Hi
Rohit,
It is a bug that the behavior is different depending on the
order of invocation. Please feel free to file a bug.
Writing your code like this may help:
query.addJoinedAttribute((new
ExpressionBuilder()).anyOf("empinfo.phone.empid"));
query.setSelectionCriteria((new
ExpressionBuilder().anyOf("empinfo.phone.empid").get("phone").equal("11"));
When our queries run, they will fix the ExpressionBuilders to be
clean.
If that does not help (please include that information in the
bug), the following should work.
query.addJoinedAttribute((new
ExpressionBuilder(empType)).anyOf("empinfo.phone.empid"));
query.setSelectionCriteria((new
ExpressionBuilder(empType).anyOf("empinfo.phone.empid").get("phone").equal("11"));
-Tom
Rohit Banga wrote:
Hi Tom,
No this does not work. Since we are reusing the /join/
_expression_ the query generated is
select * from empinfo t0, phone t1 where t0.empid=t1.empid and
t1.phone='11'
in place of the following correct one
select * from empinfo t0, phone t1, phone t2, where
t0.empid=t1.empid and t1.phone='11' and t2.empid=t0.empid
However instead of reusing the /join/ variable if I use the
following code:
query.addJoinedAttribute(query.getExpressionBuilder().anyOf("empinfo.phone.empid"));
query.setSelectionCriteria(query.getExpressionBuilder().anyOf("empinfo.phone.empid").get("phone").equal("11"));
the query is generated correctly.
If I set the selection criteria before adding the join
attribute, then the incorrect query is generated. *Is this
expected by design? Why is it important to add the join
attribute before setting the selection criteria?*
Thanks
On 12/20/2010 7:58 PM, Tom Ware wrote:
Hi Rohit,
Does it help if you do something like this?
_expression_ join =
query.getExpressionBuilder().anyOf("empinfo.phone.empid");
query.addJoinedAttribute(join);
query.setSelectionCriteria(join.get("phone").equal("11"));
-Tom
Rohit Banga wrote:
Hi Tom
It seems the context of the question was not very clear from
the mail. Sorry for that!
/"empinfo.phone.empid"/ is actually a join attribute for
joining employee and phone tables.
Here is some sample code:
Class<?> emptype =
dcl.createDynamicClass("jpatest.empinfo");
Class<?> phonetype =
dcl.createDynamicClass("jpatest.phone");
DynamicTypeBuilder empBuilder = new
JPADynamicTypeBuilder(primaryType, null, "empinfo");
DynamicTypeBuilder phoneBuilder = new
JPADynamicTypeBuilder(secondaryType, null, "phone");
/**
... add the direct mappings here
*/
empBuilder.addOneToManyMapping("empinfo.phone.empid",
phoneBuilder.getType(), "phone.empid");
phoneBuilder.addOneToOneMapping("empinfo.phone.empid",
empBuilder.getType(), "phone.empid");
helper.addTypes(false, true, empBuilder.getType(),
phoneBuilder.getType());
ReadAllQuery query = new
DynamicHelper(session).newReadAllQuery(empBuilder.getType().getDescriptor().getAlias());
// if I reverse the order of the two, then the query
is not generated properly as explained in the mail below
query.addJoinedAttribute(query.getExpressionBuilder().anyOf("empinfo.phone.empid"));
query.setSelectionCriteria(query.getExpressionBuilder().anyOf("empinfo.phone.empid").get("phone").equal("11"));
Thanks
Hi Rohit,
I am a bit surprised ".anyOf("empinfo.phone.empid")"
works at all. I would expect you to have to write
something like:
"get("empinfo").anyOf("phone").get("empid") - i.e. When
using the _expression_ API, you should not use the "."
notation within the method calls.
-Tom
Rohit Banga wrote:
Hello All
I have a phone table and an employee table. The phone
table has a foreign key constraint on the employee id.
An employee can have multiple phones.
Now when I query for a employee having phone number say
'11' I set the selection criteria as:
query.setSelectionCriteria(
query.getExpressionBuilder().anyOf("empinfo.phone.empid").get("phone").equal("11"));
I add the following join attribute:
query.addJoinAttribute(query.getExpressionBuilder().anyOf("empinfo.phone.empid"));
_Case 1:_ If I set the selection criteria before adding
the join attribute the query generated is:
select * from empinfo t0, phone t1 where
t0.empid=t1.empid and t1.phone='11'
which does not return all the phone numbers of the
employee having phone number '11'.
_Case 2_: If I set the selection criteria after adding
the join attribute the query generated is:
select * from empinfo t0, phone t1, phone t2, where
t0.empid=t1.empid and t1.phone='11' and
t2.empid=t0.empid
which returns all the phone numbers of the employee
having phone number '11'.
Also in case 1 if I generate the query for the second
time with the same session, the query of case 2 is
generated, however again not all phone numbers of the
employee having phone number '11' are generated
(*perhaps due to caching?*)
If I do not set any selection criteria the first time I
query, then all the information is returned the first
time as expected. If I now use the sequence of Case 1
for creating a query in the same session then the
correct result is obtained. *How to explain this?*
*Is this behavior expected? Why is it important to add
the join attribute before setting the selection
criteria?*
*Could you please point me to the relevant
documentation?*
Thanks in Advance!
--
Thanks and Regards
Rohit Banga
Member Technical Staff
Oracle Server Technologies
------------------------------------------------------------------------
_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users
--
Thanks and Regards
Rohit Banga
Member Technical Staff
Oracle Server Technologies
--
Thanks and Regards
Rohit Banga
Member Technical Staff
Oracle Server Technologies
--
Thanks and Regards
Rohit Banga
Member Technical Staff
Oracle Server Technologies
|