Jacob,

 

Please disregard my last message. I figured out what my problem was. I was
not declaring the reverse-foreignkey correctly. 

 

That said, I still see what seems to be some anomalies in the query
generation.

 

For instance, if I run a report query and specify the following list as an
attribute list, using different aliases in that list, I get the correct
projection list in the SQL query (A1.reference_name,A2.reference_name),
which extracts the same  column from 2 different rows satisfying different
criteria on the same table:

 

q.setAttributes(new String[]{
"HASVIEW.references_.referenceName_","PROPERTIES.references_.referenceName_"
});

 

SQL: SELECT A1.reference_name,A2.reference_name FROM EObject A0 INNER JOIN
EReferenceValue A1 ON A0.repository_id=A1.container_repository_id INNER JOIN
EReferenceValue A2 ON A0.repository_id=A2.container_repository_id WHERE (
A1.feature_id = ?) AND  (A2.feature_id = ?)

 

Now, if I add one extra level of navigation in the path expression in my
attribute list, as shown below, the generated SQL query is wrong, as the
same column is accessed twice in the SQL projection
(A4.database_id,A4.database_id):

 

q.setAttributes(new String[]{
"HASVIEW.references_.referenceList_.databaseID_","PROPERTIES.references_.ref
erenceList_.databaseID_"});

        

SQL:SELECT A4.database_id,A4.database_id FROM EObject A0 INNER JOIN
EReferenceValue A1 ON A0.repository_id=A1.container_repository_id INNER JOIN
EReferenceValue A2 ON A0.repository_id=A2.container_repository_id INNER JOIN
EReferenceValue A3 ON A0.repository_id=A3.container_repository_id INNER JOIN
EReferenceListElement A4 ON A3.database_id=A4.database_id WHERE (
A1.feature_id = ?) AND  (A2.feature_id = ?)

 

I was expecting to get something like the following query instead:

 

SQL:SELECT A3.database_id,A5.database_id FROM EObject A0 INNER JOIN
EReferenceValue A1 ON A0.repository_id=A1.container_repository_id INNER JOIN
EReferenceValue A2 ON A0.repository_id=A2.container_repository_id INNER JOIN
EReferenceListElement A3 ON A2.database_id=A3.database_id INNER JOIN
EReferenceValue A4 ON A0.repository_id=A4.container_repository_id INNER JOIN
EReferenceListElement A5 ON A4.database_id=A5.database_id WHERE (
A1.feature_id = ?) AND  (A2.feature_id = ?)

 

Would it be wrong to expect something like the query above? 

 

Thanks,

 

- Cassio

 

-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] 
Sent: Monday, August 09, 2004 11:54 AM
To: [EMAIL PROTECTED]; [EMAIL PROTECTED]
Subject: RE: regression with use of alias in ReportQuery setAttributes?

 

Hi, 

 

The new test passes fine and most of my queries seem to work fine too. I'm

having a problem to access a field of a given class using a report query

attribute list. This doesn't seem to have anything to do with aliases.

The field is mapped as a foreign key (reference-descriptor), and instead of

having the generated SQL query accessing that field of the object at the end

of a traversal path, as it is the case for the other fields of the same

object that I access using the same path in the same query, I have the

primary key of the object just before that last object in the traversal

path, as declared in the report query attribute list (see code extract

below). 

 

Criteria crit1 = new Criteria();

crit1.addEqualTo("references_.featureID_", new Integer(11));

 

ReportQueryByCriteria q =

QueryFactory.newReportQuery(PersistentEObject.class, crit1);

 

q.setAttributes(new String

{"HASVIEW.references_.referenceObject_.className_",            

 "HASVIEW.references_.referenceObject_.repositoryID_"});

        

 

The produced query is:

 

SQL:SELECT A2.class_name,A2.repository_id FROM EObject A0 INNER JOIN

EReferenceValue A1 ON A0.repository_id=A1.container_repository_id INNER JOIN

EObject A2 ON A1.database_id=A2.repository_id WHERE A1.feature_id = ?

 

The problem I have is that the reference-descriptor for referenceObject_ is

not supposed to refer to the primary key (database_id) of the pointed table

but to another column which is not a key. Is that possible? 

I see it works fine for collections (through inverse-foreignkey) but I can't

see how I can make it work for a 1-1 reference. 

 

Thanks,

 

- Cassio

 

-----Original Message-----

From: Jakob Braeuchi [mailto:[EMAIL PROTECTED] 

Sent: Saturday, August 07, 2004 2:23 PM

To: OJB Users List; [EMAIL PROTECTED]

Subject: Re: regression with use of alias in ReportQuery setAttributes?

 

hi cassio,

 

there's a testcase QuerTest#testReportQueryAlias that uses aliases to choose

 

columns. i added "NAMES.allArticlesInGroup.articleName" to have the same

column 

twice.

 

Criteria crit1 = new Criteria();

crit1.setAlias("NAMES");

crit1.addLike("upper(allArticlesInGroup.articleName)", "F%");

 

Criteria crit2 = new Criteria();

crit2.setAlias("STOCKS");

crit2.addGreaterOrEqualThan("allArticlesInGroup.stock", new Integer(110));

 

crit1.addAndCriteria(crit2);

ReportQueryByCriteria q = QueryFactory.newReportQuery(ProductGroup.class,

crit1);

q.setAttributes(new String[]{

"groupId","groupName",

"STOCKS.allArticlesInGroup.articleName",

"NAMES.allArticlesInGroup.articleName", "NAMES.allArticlesInGroup.stock"});

 

Iterator iter = broker.getReportQueryIteratorByQuery(q);

 

the generate sql is as follows, and imo the aliases are correctly resolved

 

A2.Artikelname,A1.Artikelname,A1.Lagerbestand

 

SELECT 

A0.Kategorie_Nr,A0.KategorieName,A2.Artikelname,A1.Artikelname,A1.Lagerbesta

nd 

FROM Kategorien A0 LEFT OUTER JOIN Artikel A1 ON

A0.Kategorie_Nr=A1.Kategorie_Nr 

LEFT OUTER JOIN BOOKS A1E1 ON A0.Kategorie_Nr=A1E1.Kategorie_Nr LEFT OUTER

JOIN 

CDS A1E2 ON A0.Kategorie_Nr=A1E2.Kategorie_Nr LEFT OUTER JOIN Artikel A2 ON 

A0.Kategorie_Nr=A2.Kategorie_Nr LEFT OUTER JOIN BOOKS A2E1 ON 

A0.Kategorie_Nr=A2E1.Kategorie_Nr LEFT OUTER JOIN CDS A2E2 ON 

A0.Kategorie_Nr=A2E2.Kategorie_Nr WHERE ( (upper(A1.Artikelname) LIKE 'F%'

OR 

upper(A1E1.Artikelname) LIKE 'F%' OR upper(A1E2.Artikelname) LIKE 'F%')) AND

 

((A2.Lagerbestand >= '110' OR A2E1.Lagerbestand >= '110' OR

A2E2.Lagerbestand >= 

'110'))

 

jakob

 

J.Braeuchi schrieb:

> Hi Jacob,

> 

> I apologize for sending this directly to you. I tried to send it to the

ojb

> users list but it returned with an error.

> I tried your fix (files SqlQueryStatement.java and

SqlSelectStatement.java,

> is there anything else I'm missing?).

> 

> I don't get the "undefined alias" error message anymore but I don't always

> get the right query result. I'm giving some code extract and the generated

> SQL query below. My report query extracts different attribute values using

> different aliases but in the generated SQL, the values returned for the 2

> different attribute extractions are exactly the same (A3.

> reference_object_repository_id), and the join conditions don't look 

> right to

> me. I hope the code extract below will allow you to see where the problem

> is, let me know otherwise.

> 

> If I change the path expressions used in the call to method 

> setAttributes as

> follows, then I get the right SQL query and result. Am I doing something

> wrong?

> 

> q.setAttributes(new String[]{"repositoryID_", "className_",

>

"HASVIEW.references_.referenceObjectRepositoryID_","PROPERTIES.references_.r

 

> 

> eferenceObjectRepositoryID_"});

>        Thanks,

> 

> - Cassio

> 

>        ArrayList list = new java.util.ArrayList();

> 

>        Criteria crit1 = new Criteria();

>        crit1.setAlias("HASVIEW");

>        crit1.addEqualTo("references_.featureID_", new Integer(11));

> 

>        Criteria crit2 = new Criteria();

>        crit2.setAlias("PROPERTIES");

>        crit2.addEqualTo("references_.featureID_", new Integer(17));

> 

>        crit1.addAndCriteria(crit2);

>        ReportQueryByCriteria q =

> QueryFactory.newReportQuery(PersistentEObject.class, crit1);

>        q.setAttributes(new String[]{"repositoryID_", "className_",

>

"HASVIEW.references_.referenceObjectRepositoryID_","PROPERTIES.references_.r

 

> 

> eferenceObjectRepositoryID_"});

> 

> 

>        GENERATED SQL:SELECT

>

A0.repository_id,A0.class_name,A3.reference_object_repository_id,A3.referenc

 

> 

> e_object_repository_id FROM EObject A0 INNER JOIN EReferenceValue A1 ON

> A0.repository_id=A1.container_repository_id INNER JOIN EReferenceValue 

> A2 ON

> A0.repository_id=A2.container_repository_id INNER JOIN EReferenceValue 

> A3 ON

> A0.repository_id=A3.container_repository_id WHERE ( A1.feature_id = ?) AND

> (A2.feature_id = ?)

> 

> 

> 

> 

> 

> 

> ---------------------------------------------------------------------

> 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]

Reply via email to