cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Robert Zeigler <robert.zeig...@roxanemy.com>
Subject Re: EJBQL and parameters
Date Wed, 08 Apr 2009 18:11:12 GMT
Two thoughts.
1) You're not doing anything that /requires/ EJBQLQuery. So, if  
you're /really/ interested in using the cayenne-provided constants,  
switch to SelectQuery.
     SelectQuery q = new SelectQuery(UserSchedule.class);//<-- see?  
Type safety... :)
     Expression e =  
ExpressionFactory 
.matchExp(UserSchedule.USER_ID_PROPERTY,theUserIdValue);
     q.setQualifier(e);
     UserSchedule us = (UserSchedule)  
DataObjectUtils.objectForQuery(objectContext,q);

     us.getSku();

2) Externalize your query.
      This doesn't save you from having to change column names, but at  
least your query is external to the code, so
       a) You can reuse it other places (so fewer places to change)
       b) All queries in one place, if you externalize them all, so  
you don't have to hunt through your code to find them.
       c) You can fix your query without a recompile.


3) Use SQLTemplate.  SQLTemplate let's you script anything, including  
table and column names.  BUT, you'll be writing direct sql, so you'll  
have to use the database names rather than the object names.


Note that EJBQLQuery parsing follows (or is supposed to follow) the  
JPA 1.0 spec.  So if you can find reference in the spec that says that  
parameters can be used anywhere (including column names), then you  
should file a feature request.

Robert

On Apr 8, 2009, at 4/89:08 AM , Francois Eyl wrote:

> oh, sorry it's my bad. I did a typing mistake I wanted to type :
> query.setParameter("SKDID", UserSchedule.SCHEDULE_ID_PROPERTY);
>
> Robert, you right, I'm trying to use paramters to specify Columns  
> and so use
> available constants coming from Cayenne. This way, even if columns  
> name
> change, nothing to change into the query. But, parameters sounds  
> work only
> for values :(
>
> No working solution please ?
>
> Thanks,
> Francois
>
> 2009/4/8 Robert Zeigler <robert.zeigler@roxanemy.com>
>
>> Hm. I've never thought about specifying the columns and table via
>> parameters.
>> Event supposing that this works (not convinced it does/will), do you
>> actually have a property named 1 in the UserSchedule entity
>> (select us.:SKDID...setParameter("SKDID",1) => select us.1)?
>>
>> Try specifying the entity and property names directly.  Parameters  
>> are
>> generally used for parameterized values, like:
>>
>> EJQLQuery query = new EJBQLQuery("select us.sku from UserSchedule  
>> us where
>> us.userId=:id");
>> query.setParameter("id",1);
>>
>> Robert
>>
>>
>> On Apr 8, 2009, at 4/84:48 AM , Francois Eyl wrote:
>>
>> Howdy guys,
>>>
>>> I'm trying to use EJBQL query and parameters, but I can't get it  
>>> to work.
>>> Is
>>> there something special for ?
>>> Bellow is a quick sample of what I'm doing :
>>>
>>>              String queryString = "SELECT us.:SKDID FROM :USCHED  
>>> us WHERE
>>> us.:UID=1";
>>>              EJBQLQuery query = new EJBQLQuery(queryString);
>>>
>>>              query.setParameter("SKDID", 1);
>>>              query.setParameter("USCHED",
>>> UserSchedule.class.getSimpleName());
>>>              query.setParameter("UID",  
>>> UserSchedule.USER_ID_PROPERTY);
>>>
>>>              try {
>>>                 ctx.getContext().performQuery(query);
>>>              } catch (CayenneRuntimeException e) {
>>>                  System.err.println(e.getMessage());
>>>              }
>>>
>>> I'm getting the following message : "[v.3.0M5 Dec 09 2008  
>>> 00:42:23] Error
>>> parsing EJB QL statement".
>>>
>>> Can somebody tell me where I'm wrong ?
>>>
>>> Thanks,
>>> Francois.
>>>
>>
>>


Mime
View raw message