You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-user@db.apache.org by Kirill Petrov <KP...@uci.edu> on 2005/05/31 04:32:39 UTC

Collection Query, continuation

Hello everybody,

Recently, I asked a question how can a query an object having a property 
which is a collection of objects. I received an answer, so, now my query 
looks like this:

public static Collection findModelsByReactionsName(String rName) {

     PersistenceBroker broker = 
PersistenceBrokerFactory.defaultPersistenceBroker();

     try{
       Criteria crit = new Criteria();
       crit.addLike("reactions.name", rName);
       QueryByCriteria query = new QueryByCriteria(Model.class, crit);
       return broker.getCollectionByQuery(query);
     } finally {
       broker.close();
     }
   }

Now, I have another problem. There are several subclasses of Reaction. 
Those subclasses of course have their own properties. For example, 
"BidirectionalReaction" has a property "reverseRate". I want to query 
the models by this property which implies that I am looking only for the 
models that have BidirectionalReactions in them. But I don't know how to 
do that. If I just specify "reactions.reverseRate" in the query, OJB 
generates SQL that would try to query using all the possibe subclasses. 
The SQL of course fails since only one table would have a column 
corresponding to reverseRate.

How do I write such a query?

thanks a lot,

Kirill

PS

Here is explanation of my object model:

I have an object model in which there are two objects: Model and
Reactiont. This is basically n to m relationship. Model can have a 
number of Reactions. Reactions can be in a number of Models.
In Java this is implemented by a Collection property in Model class.

I want to construct a query that allows me to find all the models that
have a particular reaction in them.



---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org


Re: Collection Query, continuation

Posted by Armin Waibel <ar...@apache.org>.
 >> you have the same problem with latest from CVS, please summarize and
 >> describe the problem in pseudo code, then I will write a test case to
 >> reproduce your problem.
 >
 > should I file a bug on the web site or should I just email it to you?
 >
 > thanks,
 >
 > Kirill

Please create a detailed bug report on jira.

http://issues.apache.org/jira/browse/OJB

regards,
Armin


Kirill Petrov wrote:
> Armin Waibel wrote:
> 
>>>> how did you map the sub-classes of Citation.class, do you use 
>>>> 'extent-class' elements in mapping for Citation.class or do you use 
>>>> 'super-references' in the sub-classes?
>>>
>>>
>>>
>>> here is what I have:
>>> <class-descriptor class="edu.uci.ics.sigmoid.Citation">
>>>   <extent-class class-ref="edu.uci.ics.sigmoid.OJBCitation" />
>>>   <extent-class class-ref="edu.uci.ics.sigmoid.Article" />
>>>   <extent-class class-ref="edu.uci.ics.sigmoid.Book" />
>>>   <extent-class class-ref="edu.uci.ics.sigmoid.Booklet" />
>>>   <extent-class class-ref="edu.uci.ics.sigmoid.Unpublished" />
>>>   <extent-class class-ref="edu.uci.ics.sigmoid.TechReport" />
>>>   <extent-class class-ref="edu.uci.ics.sigmoid.Proceedings" />
>>>   <extent-class class-ref="edu.uci.ics.sigmoid.PhDThesis" />
>>>   <extent-class class-ref="edu.uci.ics.sigmoid.MiscCitation" />
>>>   <extent-class class-ref="edu.uci.ics.sigmoid.MastersThesis" />
>>>   <extent-class class-ref="edu.uci.ics.sigmoid.Manual" />
>>>   <extent-class class-ref="edu.uci.ics.sigmoid.InProceedings" />
>>>   <extent-class class-ref="edu.uci.ics.sigmoid.InCollection" />
>>>   <extent-class class-ref="edu.uci.ics.sigmoid.InBook" />
>>>   <extent-class class-ref="edu.uci.ics.sigmoid.Conference" />
>>> </class-descriptor>
>>>
>>> should I change it somehow?
>>>
>>
>> No, seems ok. So it seems you found a bug.
>> Do you use OJB1.0.3 or the latest from CVS OJB_1_0_RELEASE branch? If 
> 
> 1.0.3
> 
>> possible please try with it with the latest from CVS. If you can't or 
> 
> should I use 1.1 branch or 1.0? I'm mostly concerned with stability, 
> actually, I'd rather stay with 1.0 but if this issue will be fixed only 
> in 1.1 branch I would go with it.
> 
>> you have the same problem with latest from CVS, please summarize and 
>> describe the problem in pseudo code, then I will write a test case to 
>> reproduce your problem.
> 
> should I file a bug on the web site or should I just email it to you?
> 
> thanks,
> 
> Kirill
> 
> 
>>
>> regards,
>> Armin
>>
>>
>>> Kirill
>>>
>>>> Kirill Petrov wrote:
>>>>
>>>>> Hello guys,
>>>>>
>>>>> is it indeed a bug or am I doing something wrong?? Please, help.
>>>>>
>>>>> thanks,
>>>>>
>>>>> Kirill
>>>>>
>>>>>>> you should try using the path class hint:
>>>>>>>
>>>>>>> Criteria crit = new Criteria();
>>>>>>> crit.addLike("reactions.name", rName);
>>>>>>> QueryByCriteria query = new QueryByCriteria(Model.class, crit1);
>>>>>>> query.addPathClass("reactions", BidirectionalReaction.class);
>>>>>>>
>>>>>>> in this case ojb will only use BidirectionalReaction when 
>>>>>>> processing the relationship "reactions".
>>>>>>>
>>>>>>> there's a test case called PathTest for this feature.
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> I guess there is a bug in this feature:
>>>>>>
>>>>>> here is the code that I have
>>>>>> public static Collection findModelsByAuthorsName(String aName) {
>>>>>>
>>>>>>     PersistenceBroker broker = 
>>>>>> PersistenceBrokerFactory.defaultPersistenceBroker();
>>>>>>
>>>>>>     try{
>>>>>>       Criteria crit = new Criteria();
>>>>>>       crit.addLike("sources.author", aName);
>>>>>>       QueryByCriteria query = new QueryByCriteria(Model.class, 
>>>>>> crit, true);
>>>>>>       query.addPathClass("sources", Citation.class);
>>>>>>       return broker.getCollectionByQuery(query);
>>>>>>     } finally {
>>>>>>       broker.close();
>>>>>>     }
>>>>>>   }
>>>>>>
>>>>>> when I run it I get an error (below). The problem is that Citation 
>>>>>> is another superclass that has a number of classes that implement 
>>>>>> it. If instead of Citation I use OJBCitation (which is not 
>>>>>> extended by any class) then everything works fine.
>>>>>>
>>>>>> Do you have a fix for this or am I doing something wrong?
>>>>>>
>>>>>> [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] 
>>>>>> DEBUG: createTableAlias2: path: sources* tableAlias: 
>>>>>> model_sources_knowledge_source A1
>>>>>> [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] 
>>>>>> DEBUG: Result of getTableAlias(): null A2
>>>>>> [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] 
>>>>>> DEBUG: SQL:SELECT DISTINCT 
>>>>>> A0._id,A0.name,A0.extended_description,A0.license_id,A0.unique_dbid,A0.comment 
>>>>>> FR\
>>>>>> OM model A0 INNER JOIN (model_sources_knowledge_source A1 INNER 
>>>>>> JOIN null A2 ON A1.knowledge_source_id=A2._id) ON 
>>>>>> A0._id=A1.model_id WHERE author LIKE ?
>>>>>> [org.apache.ojb.broker.accesslayer.JdbcAccessImpl] ERROR: 
>>>>>> SQLException during the execution of the query (for 
>>>>>> edu.uci.ics.sigmoid.OJBModel): ERROR: syntax error at or near \
>>>>>> "null"
>>>>>> ERROR: syntax error at or near "null"
>>>>>> java.sql.SQLException: ERROR: syntax error at or near "null"
>>>>>>         at 
>>>>>> org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1471) 
>>>>>>
>>>>>>         at 
>>>>>> org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1256) 
>>>>>>
>>>>>>         at 
>>>>>> org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:175) 
>>>>>>
>>>>>>         at 
>>>>>> org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:389) 
>>>>>>
>>>>>>         at 
>>>>>> org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:330) 
>>>>>>
>>>>>>         at 
>>>>>> org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:240) 
>>>>>>
>>>>>>
>>>>>>
>>>>>>>
>>>>>>> jakob
>>>>>>>
>>>>>>> Kirill Petrov schrieb:
>>>>>>>
>>>>>>>> Hello everybody,
>>>>>>>>
>>>>>>>> Recently, I asked a question how can a query an object having a 
>>>>>>>> property which is a collection of objects. I received an answer, 
>>>>>>>> so, now my query looks like this:
>>>>>>>>
>>>>>>>> public static Collection findModelsByReactionsName(String rName) {
>>>>>>>>
>>>>>>>>     PersistenceBroker broker = 
>>>>>>>> PersistenceBrokerFactory.defaultPersistenceBroker();
>>>>>>>>
>>>>>>>>     try{
>>>>>>>>       Criteria crit = new Criteria();
>>>>>>>>       crit.addLike("reactions.name", rName);
>>>>>>>>       QueryByCriteria query = new QueryByCriteria(Model.class, 
>>>>>>>> crit);
>>>>>>>>       return broker.getCollectionByQuery(query);
>>>>>>>>     } finally {
>>>>>>>>       broker.close();
>>>>>>>>     }
>>>>>>>>   }
>>>>>>>>
>>>>>>>> Now, I have another problem. There are several subclasses of 
>>>>>>>> Reaction. Those subclasses of course have their own properties. 
>>>>>>>> For example, "BidirectionalReaction" has a property 
>>>>>>>> "reverseRate". I want to query the models by this property which 
>>>>>>>> implies that I am looking only for the models that have 
>>>>>>>> BidirectionalReactions in them. But I don't know how to do that. 
>>>>>>>> If I just specify "reactions.reverseRate" in the query, OJB 
>>>>>>>> generates SQL that would try to query using all the possibe 
>>>>>>>> subclasses. The SQL of course fails since only one table would 
>>>>>>>> have a column corresponding to reverseRate.
>>>>>>>>
>>>>>>>> How do I write such a query?
>>>>>>>>
>>>>>>>> thanks a lot,
>>>>>>>>
>>>>>>>> Kirill
>>>>>>>>
>>>>>>>> PS
>>>>>>>>
>>>>>>>> Here is explanation of my object model:
>>>>>>>>
>>>>>>>> I have an object model in which there are two objects: Model and
>>>>>>>> Reactiont. This is basically n to m relationship. Model can have 
>>>>>>>> a number of Reactions. Reactions can be in a number of Models.
>>>>>>>> In Java this is implemented by a Collection property in Model 
>>>>>>>> class.
>>>>>>>>
>>>>>>>> I want to construct a query that allows me to find all the 
>>>>>>>> models that
>>>>>>>> have a particular reaction in them.
>>>
>>>
>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
>>> For additional commands, e-mail: ojb-user-help@db.apache.org
>>>
>>>
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
>> For additional commands, e-mail: ojb-user-help@db.apache.org
>>
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
> For additional commands, e-mail: ojb-user-help@db.apache.org
> 
> 
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org


Re: Collection Query, continuation

Posted by Kirill Petrov <KV...@OwnMail.net>.
Armin Waibel wrote:
>>> how did you map the sub-classes of Citation.class, do you use 
>>> 'extent-class' elements in mapping for Citation.class or do you use 
>>> 'super-references' in the sub-classes?
>>
>>
>> here is what I have:
>> <class-descriptor class="edu.uci.ics.sigmoid.Citation">
>>   <extent-class class-ref="edu.uci.ics.sigmoid.OJBCitation" />
>>   <extent-class class-ref="edu.uci.ics.sigmoid.Article" />
>>   <extent-class class-ref="edu.uci.ics.sigmoid.Book" />
>>   <extent-class class-ref="edu.uci.ics.sigmoid.Booklet" />
>>   <extent-class class-ref="edu.uci.ics.sigmoid.Unpublished" />
>>   <extent-class class-ref="edu.uci.ics.sigmoid.TechReport" />
>>   <extent-class class-ref="edu.uci.ics.sigmoid.Proceedings" />
>>   <extent-class class-ref="edu.uci.ics.sigmoid.PhDThesis" />
>>   <extent-class class-ref="edu.uci.ics.sigmoid.MiscCitation" />
>>   <extent-class class-ref="edu.uci.ics.sigmoid.MastersThesis" />
>>   <extent-class class-ref="edu.uci.ics.sigmoid.Manual" />
>>   <extent-class class-ref="edu.uci.ics.sigmoid.InProceedings" />
>>   <extent-class class-ref="edu.uci.ics.sigmoid.InCollection" />
>>   <extent-class class-ref="edu.uci.ics.sigmoid.InBook" />
>>   <extent-class class-ref="edu.uci.ics.sigmoid.Conference" />
>> </class-descriptor>
>>
>> should I change it somehow?
>>
> 
> No, seems ok. So it seems you found a bug.
> Do you use OJB1.0.3 or the latest from CVS OJB_1_0_RELEASE branch? If 
1.0.3
> possible please try with it with the latest from CVS. If you can't or 
should I use 1.1 branch or 1.0? I'm mostly concerned with stability, 
actually, I'd rather stay with 1.0 but if this issue will be fixed only 
in 1.1 branch I would go with it.

> you have the same problem with latest from CVS, please summarize and 
> describe the problem in pseudo code, then I will write a test case to 
> reproduce your problem.
should I file a bug on the web site or should I just email it to you?

thanks,

Kirill


> 
> regards,
> Armin
> 
> 
>> Kirill
>>
>>> Kirill Petrov wrote:
>>>
>>>> Hello guys,
>>>>
>>>> is it indeed a bug or am I doing something wrong?? Please, help.
>>>>
>>>> thanks,
>>>>
>>>> Kirill
>>>>
>>>>>> you should try using the path class hint:
>>>>>>
>>>>>> Criteria crit = new Criteria();
>>>>>> crit.addLike("reactions.name", rName);
>>>>>> QueryByCriteria query = new QueryByCriteria(Model.class, crit1);
>>>>>> query.addPathClass("reactions", BidirectionalReaction.class);
>>>>>>
>>>>>> in this case ojb will only use BidirectionalReaction when 
>>>>>> processing the relationship "reactions".
>>>>>>
>>>>>> there's a test case called PathTest for this feature.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> I guess there is a bug in this feature:
>>>>>
>>>>> here is the code that I have
>>>>> public static Collection findModelsByAuthorsName(String aName) {
>>>>>
>>>>>     PersistenceBroker broker = 
>>>>> PersistenceBrokerFactory.defaultPersistenceBroker();
>>>>>
>>>>>     try{
>>>>>       Criteria crit = new Criteria();
>>>>>       crit.addLike("sources.author", aName);
>>>>>       QueryByCriteria query = new QueryByCriteria(Model.class, 
>>>>> crit, true);
>>>>>       query.addPathClass("sources", Citation.class);
>>>>>       return broker.getCollectionByQuery(query);
>>>>>     } finally {
>>>>>       broker.close();
>>>>>     }
>>>>>   }
>>>>>
>>>>> when I run it I get an error (below). The problem is that Citation 
>>>>> is another superclass that has a number of classes that implement 
>>>>> it. If instead of Citation I use OJBCitation (which is not extended 
>>>>> by any class) then everything works fine.
>>>>>
>>>>> Do you have a fix for this or am I doing something wrong?
>>>>>
>>>>> [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] 
>>>>> DEBUG: createTableAlias2: path: sources* tableAlias: 
>>>>> model_sources_knowledge_source A1
>>>>> [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] 
>>>>> DEBUG: Result of getTableAlias(): null A2
>>>>> [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] 
>>>>> DEBUG: SQL:SELECT DISTINCT 
>>>>> A0._id,A0.name,A0.extended_description,A0.license_id,A0.unique_dbid,A0.comment 
>>>>> FR\
>>>>> OM model A0 INNER JOIN (model_sources_knowledge_source A1 INNER 
>>>>> JOIN null A2 ON A1.knowledge_source_id=A2._id) ON 
>>>>> A0._id=A1.model_id WHERE author LIKE ?
>>>>> [org.apache.ojb.broker.accesslayer.JdbcAccessImpl] ERROR: 
>>>>> SQLException during the execution of the query (for 
>>>>> edu.uci.ics.sigmoid.OJBModel): ERROR: syntax error at or near \
>>>>> "null"
>>>>> ERROR: syntax error at or near "null"
>>>>> java.sql.SQLException: ERROR: syntax error at or near "null"
>>>>>         at 
>>>>> org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1471) 
>>>>>
>>>>>         at 
>>>>> org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1256) 
>>>>>
>>>>>         at 
>>>>> org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:175) 
>>>>>
>>>>>         at 
>>>>> org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:389) 
>>>>>
>>>>>         at 
>>>>> org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:330) 
>>>>>
>>>>>         at 
>>>>> org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:240) 
>>>>>
>>>>>
>>>>>
>>>>>>
>>>>>> jakob
>>>>>>
>>>>>> Kirill Petrov schrieb:
>>>>>>
>>>>>>> Hello everybody,
>>>>>>>
>>>>>>> Recently, I asked a question how can a query an object having a 
>>>>>>> property which is a collection of objects. I received an answer, 
>>>>>>> so, now my query looks like this:
>>>>>>>
>>>>>>> public static Collection findModelsByReactionsName(String rName) {
>>>>>>>
>>>>>>>     PersistenceBroker broker = 
>>>>>>> PersistenceBrokerFactory.defaultPersistenceBroker();
>>>>>>>
>>>>>>>     try{
>>>>>>>       Criteria crit = new Criteria();
>>>>>>>       crit.addLike("reactions.name", rName);
>>>>>>>       QueryByCriteria query = new QueryByCriteria(Model.class, 
>>>>>>> crit);
>>>>>>>       return broker.getCollectionByQuery(query);
>>>>>>>     } finally {
>>>>>>>       broker.close();
>>>>>>>     }
>>>>>>>   }
>>>>>>>
>>>>>>> Now, I have another problem. There are several subclasses of 
>>>>>>> Reaction. Those subclasses of course have their own properties. 
>>>>>>> For example, "BidirectionalReaction" has a property 
>>>>>>> "reverseRate". I want to query the models by this property which 
>>>>>>> implies that I am looking only for the models that have 
>>>>>>> BidirectionalReactions in them. But I don't know how to do that. 
>>>>>>> If I just specify "reactions.reverseRate" in the query, OJB 
>>>>>>> generates SQL that would try to query using all the possibe 
>>>>>>> subclasses. The SQL of course fails since only one table would 
>>>>>>> have a column corresponding to reverseRate.
>>>>>>>
>>>>>>> How do I write such a query?
>>>>>>>
>>>>>>> thanks a lot,
>>>>>>>
>>>>>>> Kirill
>>>>>>>
>>>>>>> PS
>>>>>>>
>>>>>>> Here is explanation of my object model:
>>>>>>>
>>>>>>> I have an object model in which there are two objects: Model and
>>>>>>> Reactiont. This is basically n to m relationship. Model can have 
>>>>>>> a number of Reactions. Reactions can be in a number of Models.
>>>>>>> In Java this is implemented by a Collection property in Model class.
>>>>>>>
>>>>>>> I want to construct a query that allows me to find all the models 
>>>>>>> that
>>>>>>> have a particular reaction in them.
>>
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
>> For additional commands, e-mail: ojb-user-help@db.apache.org
>>
>>
>>
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
> For additional commands, e-mail: ojb-user-help@db.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org


Re: Collection Query, continuation

Posted by Armin Waibel <ar...@apache.org>.
Hi Kirill,

Kirill Petrov wrote:
> Armin Waibel wrote:
> 
>> how did you map the sub-classes of Citation.class, do you use 
>> 'extent-class' elements in mapping for Citation.class or do you use 
>> 'super-references' in the sub-classes?
> 
> here is what I have:
> <class-descriptor class="edu.uci.ics.sigmoid.Citation">
>   <extent-class class-ref="edu.uci.ics.sigmoid.OJBCitation" />
>   <extent-class class-ref="edu.uci.ics.sigmoid.Article" />
>   <extent-class class-ref="edu.uci.ics.sigmoid.Book" />
>   <extent-class class-ref="edu.uci.ics.sigmoid.Booklet" />
>   <extent-class class-ref="edu.uci.ics.sigmoid.Unpublished" />
>   <extent-class class-ref="edu.uci.ics.sigmoid.TechReport" />
>   <extent-class class-ref="edu.uci.ics.sigmoid.Proceedings" />
>   <extent-class class-ref="edu.uci.ics.sigmoid.PhDThesis" />
>   <extent-class class-ref="edu.uci.ics.sigmoid.MiscCitation" />
>   <extent-class class-ref="edu.uci.ics.sigmoid.MastersThesis" />
>   <extent-class class-ref="edu.uci.ics.sigmoid.Manual" />
>   <extent-class class-ref="edu.uci.ics.sigmoid.InProceedings" />
>   <extent-class class-ref="edu.uci.ics.sigmoid.InCollection" />
>   <extent-class class-ref="edu.uci.ics.sigmoid.InBook" />
>   <extent-class class-ref="edu.uci.ics.sigmoid.Conference" />
> </class-descriptor>
> 
> should I change it somehow?
> 

No, seems ok. So it seems you found a bug.
Do you use OJB1.0.3 or the latest from CVS OJB_1_0_RELEASE branch? If 
possible please try with it with the latest from CVS. If you can't or 
you have the same problem with latest from CVS, please summarize and 
describe the problem in pseudo code, then I will write a test case to 
reproduce your problem.

regards,
Armin


> Kirill
> 
>> Kirill Petrov wrote:
>>
>>> Hello guys,
>>>
>>> is it indeed a bug or am I doing something wrong?? Please, help.
>>>
>>> thanks,
>>>
>>> Kirill
>>>
>>>>> you should try using the path class hint:
>>>>>
>>>>> Criteria crit = new Criteria();
>>>>> crit.addLike("reactions.name", rName);
>>>>> QueryByCriteria query = new QueryByCriteria(Model.class, crit1);
>>>>> query.addPathClass("reactions", BidirectionalReaction.class);
>>>>>
>>>>> in this case ojb will only use BidirectionalReaction when 
>>>>> processing the relationship "reactions".
>>>>>
>>>>> there's a test case called PathTest for this feature.
>>>>
>>>>
>>>>
>>>>
>>>> I guess there is a bug in this feature:
>>>>
>>>> here is the code that I have
>>>> public static Collection findModelsByAuthorsName(String aName) {
>>>>
>>>>     PersistenceBroker broker = 
>>>> PersistenceBrokerFactory.defaultPersistenceBroker();
>>>>
>>>>     try{
>>>>       Criteria crit = new Criteria();
>>>>       crit.addLike("sources.author", aName);
>>>>       QueryByCriteria query = new QueryByCriteria(Model.class, crit, 
>>>> true);
>>>>       query.addPathClass("sources", Citation.class);
>>>>       return broker.getCollectionByQuery(query);
>>>>     } finally {
>>>>       broker.close();
>>>>     }
>>>>   }
>>>>
>>>> when I run it I get an error (below). The problem is that Citation 
>>>> is another superclass that has a number of classes that implement 
>>>> it. If instead of Citation I use OJBCitation (which is not extended 
>>>> by any class) then everything works fine.
>>>>
>>>> Do you have a fix for this or am I doing something wrong?
>>>>
>>>> [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] 
>>>> DEBUG: createTableAlias2: path: sources* tableAlias: 
>>>> model_sources_knowledge_source A1
>>>> [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] 
>>>> DEBUG: Result of getTableAlias(): null A2
>>>> [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] 
>>>> DEBUG: SQL:SELECT DISTINCT 
>>>> A0._id,A0.name,A0.extended_description,A0.license_id,A0.unique_dbid,A0.comment 
>>>> FR\
>>>> OM model A0 INNER JOIN (model_sources_knowledge_source A1 INNER JOIN 
>>>> null A2 ON A1.knowledge_source_id=A2._id) ON A0._id=A1.model_id 
>>>> WHERE author LIKE ?
>>>> [org.apache.ojb.broker.accesslayer.JdbcAccessImpl] ERROR: 
>>>> SQLException during the execution of the query (for 
>>>> edu.uci.ics.sigmoid.OJBModel): ERROR: syntax error at or near \
>>>> "null"
>>>> ERROR: syntax error at or near "null"
>>>> java.sql.SQLException: ERROR: syntax error at or near "null"
>>>>         at 
>>>> org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1471) 
>>>>
>>>>         at 
>>>> org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1256) 
>>>>
>>>>         at 
>>>> org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:175) 
>>>>
>>>>         at 
>>>> org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:389) 
>>>>
>>>>         at 
>>>> org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:330) 
>>>>
>>>>         at 
>>>> org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:240) 
>>>>
>>>>
>>>>
>>>>>
>>>>> jakob
>>>>>
>>>>> Kirill Petrov schrieb:
>>>>>
>>>>>> Hello everybody,
>>>>>>
>>>>>> Recently, I asked a question how can a query an object having a 
>>>>>> property which is a collection of objects. I received an answer, 
>>>>>> so, now my query looks like this:
>>>>>>
>>>>>> public static Collection findModelsByReactionsName(String rName) {
>>>>>>
>>>>>>     PersistenceBroker broker = 
>>>>>> PersistenceBrokerFactory.defaultPersistenceBroker();
>>>>>>
>>>>>>     try{
>>>>>>       Criteria crit = new Criteria();
>>>>>>       crit.addLike("reactions.name", rName);
>>>>>>       QueryByCriteria query = new QueryByCriteria(Model.class, crit);
>>>>>>       return broker.getCollectionByQuery(query);
>>>>>>     } finally {
>>>>>>       broker.close();
>>>>>>     }
>>>>>>   }
>>>>>>
>>>>>> Now, I have another problem. There are several subclasses of 
>>>>>> Reaction. Those subclasses of course have their own properties. 
>>>>>> For example, "BidirectionalReaction" has a property "reverseRate". 
>>>>>> I want to query the models by this property which implies that I 
>>>>>> am looking only for the models that have BidirectionalReactions in 
>>>>>> them. But I don't know how to do that. If I just specify 
>>>>>> "reactions.reverseRate" in the query, OJB generates SQL that would 
>>>>>> try to query using all the possibe subclasses. The SQL of course 
>>>>>> fails since only one table would have a column corresponding to 
>>>>>> reverseRate.
>>>>>>
>>>>>> How do I write such a query?
>>>>>>
>>>>>> thanks a lot,
>>>>>>
>>>>>> Kirill
>>>>>>
>>>>>> PS
>>>>>>
>>>>>> Here is explanation of my object model:
>>>>>>
>>>>>> I have an object model in which there are two objects: Model and
>>>>>> Reactiont. This is basically n to m relationship. Model can have a 
>>>>>> number of Reactions. Reactions can be in a number of Models.
>>>>>> In Java this is implemented by a Collection property in Model class.
>>>>>>
>>>>>> I want to construct a query that allows me to find all the models 
>>>>>> that
>>>>>> have a particular reaction in them.
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
> For additional commands, e-mail: ojb-user-help@db.apache.org
> 
> 
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org


Re: Collection Query, continuation

Posted by Kirill Petrov <KV...@OwnMail.net>.
Armin Waibel wrote:

> how did you map the sub-classes of Citation.class, do you use 
> 'extent-class' elements in mapping for Citation.class or do you use 
> 'super-references' in the sub-classes?
here is what I have:
<class-descriptor class="edu.uci.ics.sigmoid.Citation">
   <extent-class class-ref="edu.uci.ics.sigmoid.OJBCitation" />
   <extent-class class-ref="edu.uci.ics.sigmoid.Article" />
   <extent-class class-ref="edu.uci.ics.sigmoid.Book" />
   <extent-class class-ref="edu.uci.ics.sigmoid.Booklet" />
   <extent-class class-ref="edu.uci.ics.sigmoid.Unpublished" />
   <extent-class class-ref="edu.uci.ics.sigmoid.TechReport" />
   <extent-class class-ref="edu.uci.ics.sigmoid.Proceedings" />
   <extent-class class-ref="edu.uci.ics.sigmoid.PhDThesis" />
   <extent-class class-ref="edu.uci.ics.sigmoid.MiscCitation" />
   <extent-class class-ref="edu.uci.ics.sigmoid.MastersThesis" />
   <extent-class class-ref="edu.uci.ics.sigmoid.Manual" />
   <extent-class class-ref="edu.uci.ics.sigmoid.InProceedings" />
   <extent-class class-ref="edu.uci.ics.sigmoid.InCollection" />
   <extent-class class-ref="edu.uci.ics.sigmoid.InBook" />
   <extent-class class-ref="edu.uci.ics.sigmoid.Conference" />
</class-descriptor>

should I change it somehow?

Kirill
> Kirill Petrov wrote:
> 
>> Hello guys,
>>
>> is it indeed a bug or am I doing something wrong?? Please, help.
>>
>> thanks,
>>
>> Kirill
>>
>>>> you should try using the path class hint:
>>>>
>>>> Criteria crit = new Criteria();
>>>> crit.addLike("reactions.name", rName);
>>>> QueryByCriteria query = new QueryByCriteria(Model.class, crit1);
>>>> query.addPathClass("reactions", BidirectionalReaction.class);
>>>>
>>>> in this case ojb will only use BidirectionalReaction when processing 
>>>> the relationship "reactions".
>>>>
>>>> there's a test case called PathTest for this feature.
>>>
>>>
>>>
>>> I guess there is a bug in this feature:
>>>
>>> here is the code that I have
>>> public static Collection findModelsByAuthorsName(String aName) {
>>>
>>>     PersistenceBroker broker = 
>>> PersistenceBrokerFactory.defaultPersistenceBroker();
>>>
>>>     try{
>>>       Criteria crit = new Criteria();
>>>       crit.addLike("sources.author", aName);
>>>       QueryByCriteria query = new QueryByCriteria(Model.class, crit, 
>>> true);
>>>       query.addPathClass("sources", Citation.class);
>>>       return broker.getCollectionByQuery(query);
>>>     } finally {
>>>       broker.close();
>>>     }
>>>   }
>>>
>>> when I run it I get an error (below). The problem is that Citation is 
>>> another superclass that has a number of classes that implement it. If 
>>> instead of Citation I use OJBCitation (which is not extended by any 
>>> class) then everything works fine.
>>>
>>> Do you have a fix for this or am I doing something wrong?
>>>
>>> [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] 
>>> DEBUG: createTableAlias2: path: sources* tableAlias: 
>>> model_sources_knowledge_source A1
>>> [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] 
>>> DEBUG: Result of getTableAlias(): null A2
>>> [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] 
>>> DEBUG: SQL:SELECT DISTINCT 
>>> A0._id,A0.name,A0.extended_description,A0.license_id,A0.unique_dbid,A0.comment 
>>> FR\
>>> OM model A0 INNER JOIN (model_sources_knowledge_source A1 INNER JOIN 
>>> null A2 ON A1.knowledge_source_id=A2._id) ON A0._id=A1.model_id WHERE 
>>> author LIKE ?
>>> [org.apache.ojb.broker.accesslayer.JdbcAccessImpl] ERROR: 
>>> SQLException during the execution of the query (for 
>>> edu.uci.ics.sigmoid.OJBModel): ERROR: syntax error at or near \
>>> "null"
>>> ERROR: syntax error at or near "null"
>>> java.sql.SQLException: ERROR: syntax error at or near "null"
>>>         at 
>>> org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1471) 
>>>
>>>         at 
>>> org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1256) 
>>>
>>>         at 
>>> org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:175) 
>>>
>>>         at 
>>> org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:389) 
>>>
>>>         at 
>>> org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:330) 
>>>
>>>         at 
>>> org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:240) 
>>>
>>>
>>>
>>>>
>>>> jakob
>>>>
>>>> Kirill Petrov schrieb:
>>>>
>>>>> Hello everybody,
>>>>>
>>>>> Recently, I asked a question how can a query an object having a 
>>>>> property which is a collection of objects. I received an answer, 
>>>>> so, now my query looks like this:
>>>>>
>>>>> public static Collection findModelsByReactionsName(String rName) {
>>>>>
>>>>>     PersistenceBroker broker = 
>>>>> PersistenceBrokerFactory.defaultPersistenceBroker();
>>>>>
>>>>>     try{
>>>>>       Criteria crit = new Criteria();
>>>>>       crit.addLike("reactions.name", rName);
>>>>>       QueryByCriteria query = new QueryByCriteria(Model.class, crit);
>>>>>       return broker.getCollectionByQuery(query);
>>>>>     } finally {
>>>>>       broker.close();
>>>>>     }
>>>>>   }
>>>>>
>>>>> Now, I have another problem. There are several subclasses of 
>>>>> Reaction. Those subclasses of course have their own properties. For 
>>>>> example, "BidirectionalReaction" has a property "reverseRate". I 
>>>>> want to query the models by this property which implies that I am 
>>>>> looking only for the models that have BidirectionalReactions in 
>>>>> them. But I don't know how to do that. If I just specify 
>>>>> "reactions.reverseRate" in the query, OJB generates SQL that would 
>>>>> try to query using all the possibe subclasses. The SQL of course 
>>>>> fails since only one table would have a column corresponding to 
>>>>> reverseRate.
>>>>>
>>>>> How do I write such a query?
>>>>>
>>>>> thanks a lot,
>>>>>
>>>>> Kirill
>>>>>
>>>>> PS
>>>>>
>>>>> Here is explanation of my object model:
>>>>>
>>>>> I have an object model in which there are two objects: Model and
>>>>> Reactiont. This is basically n to m relationship. Model can have a 
>>>>> number of Reactions. Reactions can be in a number of Models.
>>>>> In Java this is implemented by a Collection property in Model class.
>>>>>
>>>>> I want to construct a query that allows me to find all the models that
>>>>> have a particular reaction in them.


---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org


Re: Collection Query, continuation

Posted by Armin Waibel <ar...@apache.org>.
Hi Kirill,

how did you map the sub-classes of Citation.class, do you use 
'extent-class' elements in mapping for Citation.class or do you use 
'super-references' in the sub-classes?

regards,
Armin

Kirill Petrov wrote:
> Hello guys,
> 
> is it indeed a bug or am I doing something wrong?? Please, help.
> 
> thanks,
> 
> Kirill
> 
>>> you should try using the path class hint:
>>>
>>> Criteria crit = new Criteria();
>>> crit.addLike("reactions.name", rName);
>>> QueryByCriteria query = new QueryByCriteria(Model.class, crit1);
>>> query.addPathClass("reactions", BidirectionalReaction.class);
>>>
>>> in this case ojb will only use BidirectionalReaction when processing 
>>> the relationship "reactions".
>>>
>>> there's a test case called PathTest for this feature.
>>
>>
>> I guess there is a bug in this feature:
>>
>> here is the code that I have
>> public static Collection findModelsByAuthorsName(String aName) {
>>
>>     PersistenceBroker broker = 
>> PersistenceBrokerFactory.defaultPersistenceBroker();
>>
>>     try{
>>       Criteria crit = new Criteria();
>>       crit.addLike("sources.author", aName);
>>       QueryByCriteria query = new QueryByCriteria(Model.class, crit, 
>> true);
>>       query.addPathClass("sources", Citation.class);
>>       return broker.getCollectionByQuery(query);
>>     } finally {
>>       broker.close();
>>     }
>>   }
>>
>> when I run it I get an error (below). The problem is that Citation is 
>> another superclass that has a number of classes that implement it. If 
>> instead of Citation I use OJBCitation (which is not extended by any 
>> class) then everything works fine.
>>
>> Do you have a fix for this or am I doing something wrong?
>>
>> [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] DEBUG: 
>> createTableAlias2: path: sources* tableAlias: 
>> model_sources_knowledge_source A1
>> [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] DEBUG: 
>> Result of getTableAlias(): null A2
>> [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] DEBUG: 
>> SQL:SELECT DISTINCT 
>> A0._id,A0.name,A0.extended_description,A0.license_id,A0.unique_dbid,A0.comment 
>> FR\
>> OM model A0 INNER JOIN (model_sources_knowledge_source A1 INNER JOIN 
>> null A2 ON A1.knowledge_source_id=A2._id) ON A0._id=A1.model_id WHERE 
>> author LIKE ?
>> [org.apache.ojb.broker.accesslayer.JdbcAccessImpl] ERROR: SQLException 
>> during the execution of the query (for edu.uci.ics.sigmoid.OJBModel): 
>> ERROR: syntax error at or near \
>> "null"
>> ERROR: syntax error at or near "null"
>> java.sql.SQLException: ERROR: syntax error at or near "null"
>>         at 
>> org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1471) 
>>
>>         at 
>> org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1256) 
>>
>>         at 
>> org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:175) 
>>
>>         at 
>> org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:389) 
>>
>>         at 
>> org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:330) 
>>
>>         at 
>> org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:240) 
>>
>>
>>
>>>
>>> jakob
>>>
>>> Kirill Petrov schrieb:
>>>
>>>> Hello everybody,
>>>>
>>>> Recently, I asked a question how can a query an object having a 
>>>> property which is a collection of objects. I received an answer, so, 
>>>> now my query looks like this:
>>>>
>>>> public static Collection findModelsByReactionsName(String rName) {
>>>>
>>>>     PersistenceBroker broker = 
>>>> PersistenceBrokerFactory.defaultPersistenceBroker();
>>>>
>>>>     try{
>>>>       Criteria crit = new Criteria();
>>>>       crit.addLike("reactions.name", rName);
>>>>       QueryByCriteria query = new QueryByCriteria(Model.class, crit);
>>>>       return broker.getCollectionByQuery(query);
>>>>     } finally {
>>>>       broker.close();
>>>>     }
>>>>   }
>>>>
>>>> Now, I have another problem. There are several subclasses of 
>>>> Reaction. Those subclasses of course have their own properties. For 
>>>> example, "BidirectionalReaction" has a property "reverseRate". I 
>>>> want to query the models by this property which implies that I am 
>>>> looking only for the models that have BidirectionalReactions in 
>>>> them. But I don't know how to do that. If I just specify 
>>>> "reactions.reverseRate" in the query, OJB generates SQL that would 
>>>> try to query using all the possibe subclasses. The SQL of course 
>>>> fails since only one table would have a column corresponding to 
>>>> reverseRate.
>>>>
>>>> How do I write such a query?
>>>>
>>>> thanks a lot,
>>>>
>>>> Kirill
>>>>
>>>> PS
>>>>
>>>> Here is explanation of my object model:
>>>>
>>>> I have an object model in which there are two objects: Model and
>>>> Reactiont. This is basically n to m relationship. Model can have a 
>>>> number of Reactions. Reactions can be in a number of Models.
>>>> In Java this is implemented by a Collection property in Model class.
>>>>
>>>> I want to construct a query that allows me to find all the models that
>>>> have a particular reaction in them.
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
> For additional commands, e-mail: ojb-user-help@db.apache.org
> 
> 
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org


Re: Collection Query, continuation

Posted by Kirill Petrov <KV...@OwnMail.net>.
Hello guys,

is it indeed a bug or am I doing something wrong?? Please, help.

thanks,

Kirill

>> you should try using the path class hint:
>>
>> Criteria crit = new Criteria();
>> crit.addLike("reactions.name", rName);
>> QueryByCriteria query = new QueryByCriteria(Model.class, crit1);
>> query.addPathClass("reactions", BidirectionalReaction.class);
>>
>> in this case ojb will only use BidirectionalReaction when processing 
>> the relationship "reactions".
>>
>> there's a test case called PathTest for this feature.
> 
> I guess there is a bug in this feature:
> 
> here is the code that I have
> public static Collection findModelsByAuthorsName(String aName) {
> 
>     PersistenceBroker broker = 
> PersistenceBrokerFactory.defaultPersistenceBroker();
> 
>     try{
>       Criteria crit = new Criteria();
>       crit.addLike("sources.author", aName);
>       QueryByCriteria query = new QueryByCriteria(Model.class, crit, true);
>       query.addPathClass("sources", Citation.class);
>       return broker.getCollectionByQuery(query);
>     } finally {
>       broker.close();
>     }
>   }
> 
> when I run it I get an error (below). The problem is that Citation is 
> another superclass that has a number of classes that implement it. If 
> instead of Citation I use OJBCitation (which is not extended by any 
> class) then everything works fine.
> 
> Do you have a fix for this or am I doing something wrong?
> 
> [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] DEBUG: 
> createTableAlias2: path: sources* tableAlias: 
> model_sources_knowledge_source A1
> [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] DEBUG: 
> Result of getTableAlias(): null A2
> [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] DEBUG: 
> SQL:SELECT DISTINCT 
> A0._id,A0.name,A0.extended_description,A0.license_id,A0.unique_dbid,A0.comment 
> FR\
> OM model A0 INNER JOIN (model_sources_knowledge_source A1 INNER JOIN 
> null A2 ON A1.knowledge_source_id=A2._id) ON A0._id=A1.model_id WHERE 
> author LIKE ?
> [org.apache.ojb.broker.accesslayer.JdbcAccessImpl] ERROR: SQLException 
> during the execution of the query (for edu.uci.ics.sigmoid.OJBModel): 
> ERROR: syntax error at or near \
> "null"
> ERROR: syntax error at or near "null"
> java.sql.SQLException: ERROR: syntax error at or near "null"
>         at 
> org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1471) 
> 
>         at 
> org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1256) 
> 
>         at 
> org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:175) 
> 
>         at 
> org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:389) 
> 
>         at 
> org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:330) 
> 
>         at 
> org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:240) 
> 
> 
> 
>>
>> jakob
>>
>> Kirill Petrov schrieb:
>>
>>> Hello everybody,
>>>
>>> Recently, I asked a question how can a query an object having a 
>>> property which is a collection of objects. I received an answer, so, 
>>> now my query looks like this:
>>>
>>> public static Collection findModelsByReactionsName(String rName) {
>>>
>>>     PersistenceBroker broker = 
>>> PersistenceBrokerFactory.defaultPersistenceBroker();
>>>
>>>     try{
>>>       Criteria crit = new Criteria();
>>>       crit.addLike("reactions.name", rName);
>>>       QueryByCriteria query = new QueryByCriteria(Model.class, crit);
>>>       return broker.getCollectionByQuery(query);
>>>     } finally {
>>>       broker.close();
>>>     }
>>>   }
>>>
>>> Now, I have another problem. There are several subclasses of 
>>> Reaction. Those subclasses of course have their own properties. For 
>>> example, "BidirectionalReaction" has a property "reverseRate". I want 
>>> to query the models by this property which implies that I am looking 
>>> only for the models that have BidirectionalReactions in them. But I 
>>> don't know how to do that. If I just specify "reactions.reverseRate" 
>>> in the query, OJB generates SQL that would try to query using all the 
>>> possibe subclasses. The SQL of course fails since only one table 
>>> would have a column corresponding to reverseRate.
>>>
>>> How do I write such a query?
>>>
>>> thanks a lot,
>>>
>>> Kirill
>>>
>>> PS
>>>
>>> Here is explanation of my object model:
>>>
>>> I have an object model in which there are two objects: Model and
>>> Reactiont. This is basically n to m relationship. Model can have a 
>>> number of Reactions. Reactions can be in a number of Models.
>>> In Java this is implemented by a Collection property in Model class.
>>>
>>> I want to construct a query that allows me to find all the models that
>>> have a particular reaction in them.


---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org


Re: Collection Query, continuation

Posted by Kirill Petrov <KP...@uci.edu>.
Jakob Braeuchi wrote:
> you should try using the path class hint:
> 
> Criteria crit = new Criteria();
> crit.addLike("reactions.name", rName);
> QueryByCriteria query = new QueryByCriteria(Model.class, crit1);
> query.addPathClass("reactions", BidirectionalReaction.class);
> 
> in this case ojb will only use BidirectionalReaction when processing the 
> relationship "reactions".
> 
> there's a test case called PathTest for this feature.
I guess there is a bug in this feature:

here is the code that I have
public static Collection findModelsByAuthorsName(String aName) {

     PersistenceBroker broker = 
PersistenceBrokerFactory.defaultPersistenceBroker();

     try{
       Criteria crit = new Criteria();
       crit.addLike("sources.author", aName);
       QueryByCriteria query = new QueryByCriteria(Model.class, crit, true);
       query.addPathClass("sources", Citation.class);
       return broker.getCollectionByQuery(query);
     } finally {
       broker.close();
     }
   }

when I run it I get an error (below). The problem is that Citation is 
another superclass that has a number of classes that implement it. If 
instead of Citation I use OJBCitation (which is not extended by any 
class) then everything works fine.

Do you have a fix for this or am I doing something wrong?

[org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] DEBUG: 
createTableAlias2: path: sources* tableAlias: 
model_sources_knowledge_source A1
[org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] DEBUG: 
Result of getTableAlias(): null A2
[org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] DEBUG: 
SQL:SELECT DISTINCT 
A0._id,A0.name,A0.extended_description,A0.license_id,A0.unique_dbid,A0.comment 
FR\
OM model A0 INNER JOIN (model_sources_knowledge_source A1 INNER JOIN 
null A2 ON A1.knowledge_source_id=A2._id) ON A0._id=A1.model_id WHERE 
author LIKE ?
[org.apache.ojb.broker.accesslayer.JdbcAccessImpl] ERROR: SQLException 
during the execution of the query (for edu.uci.ics.sigmoid.OJBModel): 
ERROR: syntax error at or near \
"null"
ERROR: syntax error at or near "null"
java.sql.SQLException: ERROR: syntax error at or near "null"
         at 
org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1471)
         at 
org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1256)
         at 
org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:175)
         at 
org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:389)
         at 
org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:330)
         at 
org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:240)


> 
> jakob
> 
> Kirill Petrov schrieb:
> 
>> Hello everybody,
>>
>> Recently, I asked a question how can a query an object having a 
>> property which is a collection of objects. I received an answer, so, 
>> now my query looks like this:
>>
>> public static Collection findModelsByReactionsName(String rName) {
>>
>>     PersistenceBroker broker = 
>> PersistenceBrokerFactory.defaultPersistenceBroker();
>>
>>     try{
>>       Criteria crit = new Criteria();
>>       crit.addLike("reactions.name", rName);
>>       QueryByCriteria query = new QueryByCriteria(Model.class, crit);
>>       return broker.getCollectionByQuery(query);
>>     } finally {
>>       broker.close();
>>     }
>>   }
>>
>> Now, I have another problem. There are several subclasses of Reaction. 
>> Those subclasses of course have their own properties. For example, 
>> "BidirectionalReaction" has a property "reverseRate". I want to query 
>> the models by this property which implies that I am looking only for 
>> the models that have BidirectionalReactions in them. But I don't know 
>> how to do that. If I just specify "reactions.reverseRate" in the 
>> query, OJB generates SQL that would try to query using all the possibe 
>> subclasses. The SQL of course fails since only one table would have a 
>> column corresponding to reverseRate.
>>
>> How do I write such a query?
>>
>> thanks a lot,
>>
>> Kirill
>>
>> PS
>>
>> Here is explanation of my object model:
>>
>> I have an object model in which there are two objects: Model and
>> Reactiont. This is basically n to m relationship. Model can have a 
>> number of Reactions. Reactions can be in a number of Models.
>> In Java this is implemented by a Collection property in Model class.
>>
>> I want to construct a query that allows me to find all the models that
>> have a particular reaction in them.
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
>> For additional commands, e-mail: ojb-user-help@db.apache.org
>>
>>
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
> For additional commands, e-mail: ojb-user-help@db.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org


Re: Collection Query, continuation

Posted by Jakob Braeuchi <jb...@gmx.ch>.
hi kirill,

you should try using the path class hint:

Criteria crit = new Criteria();
crit.addLike("reactions.name", rName);
QueryByCriteria query = new QueryByCriteria(Model.class, crit1);
query.addPathClass("reactions", BidirectionalReaction.class);

in this case ojb will only use BidirectionalReaction when processing the 
relationship "reactions".

there's a test case called PathTest for this feature.

jakob

Kirill Petrov schrieb:
> Hello everybody,
> 
> Recently, I asked a question how can a query an object having a property 
> which is a collection of objects. I received an answer, so, now my query 
> looks like this:
> 
> public static Collection findModelsByReactionsName(String rName) {
> 
>     PersistenceBroker broker = 
> PersistenceBrokerFactory.defaultPersistenceBroker();
> 
>     try{
>       Criteria crit = new Criteria();
>       crit.addLike("reactions.name", rName);
>       QueryByCriteria query = new QueryByCriteria(Model.class, crit);
>       return broker.getCollectionByQuery(query);
>     } finally {
>       broker.close();
>     }
>   }
> 
> Now, I have another problem. There are several subclasses of Reaction. 
> Those subclasses of course have their own properties. For example, 
> "BidirectionalReaction" has a property "reverseRate". I want to query 
> the models by this property which implies that I am looking only for the 
> models that have BidirectionalReactions in them. But I don't know how to 
> do that. If I just specify "reactions.reverseRate" in the query, OJB 
> generates SQL that would try to query using all the possibe subclasses. 
> The SQL of course fails since only one table would have a column 
> corresponding to reverseRate.
> 
> How do I write such a query?
> 
> thanks a lot,
> 
> Kirill
> 
> PS
> 
> Here is explanation of my object model:
> 
> I have an object model in which there are two objects: Model and
> Reactiont. This is basically n to m relationship. Model can have a 
> number of Reactions. Reactions can be in a number of Models.
> In Java this is implemented by a Collection property in Model class.
> 
> I want to construct a query that allows me to find all the models that
> have a particular reaction in them.
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
> For additional commands, e-mail: ojb-user-help@db.apache.org
> 
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org