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
|