Unfortunately, "setPathOuterJoin" only applies the outer join to joins with
other tables, not values. In other words, whereas I need
SELECT t.name, l.meaning
FROM tasks t, lookup l
WHERE t.userid = 9999 AND
l.lookup_code (+) = t.lang AND
l.lookup_type (+) = 'PREFERRED_LANGUAGE'
instead what it gives me is
SELECT t.name, l.meaning
FROM tasks t, lookup l
WHERE t.userid = 9999 AND
l.lookup_code (+) = t.lang AND
l.lookup_type = 'PREFERRED_LANGUAGE'
Or, using LEFT JOIN syntax, it should be:
SELECT t.name, l.meaning
FROM tasks t LEFT JOIN lookup l
ON (l.lookup_code = t.lang AND
l.lookup_type = 'PREFERRED_LANGUAGE')
WHERE t.userid = 9999
But instead it's giving
SELECT t.name, l.meaning
FROM tasks t LEFT JOIN lookup l
ON (l.lookup_code = t.lang)
WHERE t.userid = 9999 AND
l.lookup_type = 'PREFERRED_LANGUAGE'
which of course doesn't work. As near as I can tell, that happens because
OJB isn't taking the fact that the outer join was applied to that path when
it processes the criteria. So it appears to be a bug in how the SQL is
constructed when there's a value in an outer-joined path.
-----Original Message-----
From: Jakob Braeuchi [mailto:[EMAIL PROTECTED]
Sent: Sunday, August 03, 2003 5:55 AM
To: OJB Users List
Subject: Re: Associating an outer join with a value for a report
hi jim,
you can force ojb to use an outer join by using setPathOuterJoin :
ReportQueryByCriteria query;
Criteria crit, having;
crit = new Criteria();
having = new Criteria();
having.addGreaterThan("sum(konti.saldo)", new Integer(200));
query = new ReportQueryByCriteria(Person.class, crit);
query.setColumns(new String[] { "id", "name", "vorname",
"sum(konti.saldo)" });
query.addGroupBy(new String[]{ "id", "name", "vorname" });
query.setHavingCriteria(having);
query.setPathOuterJoin("konti");
broker.getReportQueryIteratorByQuery(query);
produces this sql using an OUTER join :
SELECT A0.id,A0.name,A0.vorname,sum(A1.saldo) FROM tabPerson A0 LEFT
OUTER JOIN tabKonto A1 ON A0.id=A1.idPerson GROUP BY
A0.id,A0.name,A0.vorname HAVING sum(A1.saldo) > '200'
the outer join is used for the columns defined in the relationship
descriptor. in your case on 'lang' only.
as far as i can see you want to have some kind of a predefined value
'PREFERRED_LANGUAGE' in your query ??
may be you should try to use a query customizer.
jakob
Jim Moore wrote:
>I've done a work-around by creating a view, but I'd rather not create
>one for all the possible values of lookup_type. Is there no other way?
>It seems like a pretty significant deficiency in the API if I can't
>even FORCE the outer join in code. :(
>
>
>-----Original Message-----
>From: Jim Moore
>Sent: Friday, August 01, 2003 3:42 PM
>To: 'OJB Users List'
>Subject: Associating an outer join with a value for a report
>
>
>First, what I'm trying to accomplish...
>
>I need to get this SQL:
>
>SELECT t.name, l.meaning
>FROM tasks t, lookup l
>WHERE t.userid = 9999 AND
> l.lookup_code (+) = t.lang AND
> l.lookup_type (+) = 'PREFERRED_LANGUAGE'
>
>
>Currently I have this
>
>Task:
><reference-descriptor name="primaryLanguage" class-ref="Lookup">
> <foreignkey field-ref="lang"/>
></reference-descriptor>
>
>Lookup:
><field-descriptor name="lookupCode"
> primarykey="true"
> column="LOOKUP_CODE" jdbc-type="VARCHAR"/>
><field-descriptor name="lookupType"
> column="LOOKUP_TYPE" jdbc-type="VARCHAR"/>
>
>
>Unfortunately, it can't think of how to express the relationship in the
>above SQL in the XML. So I tried doing the following code:
>
>
>Criteria criteria = new Criteria(); criteria.addEqualTo("userid", new
>Long(9999)); criteria.addEqualTo("primaryLanguage.lookupType",
>"PREFERRED_LANGUAGE"); ReportQueryByCriteria q =
>QueryFactory.newReportQuery(Task.class, criteria);
>q.setPathOuterJoin("primaryLanguage");
>q.setPathOuterJoin("primaryLanguage.lookupType");
>q.setColumns(new String[] {"name", "primaryLanguage.meaning"});
>
>
>Unfortunately, I can't figure out a way to get it to apply the
>outer-join to the LOOKUP_TYPE column, as
>setPathOuterJoin("primaryLanguage.lookupType")
>doesn't do anything, and there's no "addLeftJoinEqualTo" or the like.
>
>Ideas?
>
>What I'd LIKE to be able to do is something along the lines of
>
>
>Lookup:
><field-descriptor name="lookupCode"
> primarykey="true"
> column="LOOKUP_CODE" jdbc-type="VARCHAR"/>
><field-descriptor name="lookupType"
> primarykey="true"
> column="LOOKUP_TYPE" jdbc-type="VARCHAR"/>
>
>Task:
><reference-descriptor name="primaryLanguage" class-ref="Lookup">
> <foreignkey field-ref="lang"/>
> <foreignkey field-value="PREFERRED_LANGUAGE"/>
></reference-descriptor>
>
>
>That way the relationship can be declaratively stated in the XML.
>
>Thanks!
>
>-Jim Moore
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]
>
>
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]