You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cayenne.apache.org by "Alexander Lamb (dev)" <al...@mac.com> on 2007/09/01 08:42:04 UTC

Re: Null pointer in Cayenne 2.0.3 code

> I see Andrus already replied a bit ...
>
> One thing I'd suggest doing when you go back and re-work it is to  
> not do:
>
> Expression q = Expression.fromString("patientPk = '" + pk + "'");
>
> This could cause you problems if your string value ever has single
> quotes in it or other special characters.  It is far better to use
> bindings.  A better pattern for strings (or just in general) would
> look like:
>
> final Expression expression = Expression.fromString("patientPk =  
> $pk");
> Map parameters = new HashMap(1);
> parameters.put("pk", pk);
> SelectQuery query = new SelectQuery(Patient.class,
> expression.expWithParameters(parameters));
> List items = dataContext.performQuery(query);
>
> By creating an expression with substitution parameters, Cayenne will
> quote and escape text correctly for you.  Of course, perhaps you
> already know all of this and it was is just test code you were trying
> to get to work.  :-)

Exactly... in desperation, you end up trying many different things!
>
> /dev/mrg
>
>
> On 8/31/07, Alexander Lamb (dev) <al...@mac.com> wrote:
>> Initially, it was a static method to fetch a Patient from the primary
>> key (give the DataContext, the String, returns the Patient or null).
>>
>> Since whatever I was doing would crash Cayenne, I simply tried to do
>> fetch all patients:
>>
>> Here is the function (will all my experiments commented out :-)
>>
>> Oviously, I simply want to fetch a Patient from his key (a varchar of
>> approx. 35 characters).
>>
>>         public static Patient patientWithPKInContext(String pk,  
>> DataContext
>> dataContext) {
>>           //Expression q = ExpressionFactory.matchExp
>> (Patient.BIRTH_CITY_PROPERTY,"Bitola");
>>           //Expression q = Expression.fromString("patientPk = '" +  
>> pk + "'");
>> //        Patient p = (Patient)DataObjectUtils.objectForPK 
>> (dataContext,
>> "Patient", pk);
>>           //System.out.println("--- found object: " + p);
>>           //return p;
>>
>> //        System.out.println("EXP:" + q.toString());
>>         //    SelectQuery s = new SelectQuery(Patient.class,q);
>>           //  List patients = dataContext.performQuery(s);
>>      SelectQuery allPatients = new SelectQuery(Patient.class);
>>      List patients = dataContext.performQuery(allPatients);
>>
>>             if(patients.size() == 0)
>>                return null;
>>             else
>>                return (Patient)patients.get(0);
>>
>>      }
>>
>> Le 31 août 07 à 17:07, Michael Gentry a écrit :
>>
>>> Hi Alex,
>>>
>>> I'm curious as to why:
>>>
>>> at ch.rodano.msbase.model.Patient.patientWithPKInContext
>>> (Patient.java:30)
>>>
>>> is in your stack trace?  What does that method do?
>>>
>>> Thanks,
>>>
>>> /dev/mrg
>>>
>>>
>>> On 8/31/07, Alexander Lamb (dev) <al...@mac.com> wrote:
>>>> Hello list,
>>>>
>>>> We are experimenting a Cayenne crash and wondering how to get
>>>> around it.
>>>>
>>>> Here is the place of the crash:
>>>>
>>>> java.lang.NullPointerException
>>>>         at org.apache.cayenne.query.BaseQueryMetadata.resolve
>>>> (BaseQueryMetadata.java:97)
>>>>         at org.apache.cayenne.query.SelectQuery.getMetaData
>>>> (SelectQuery.java:
>>>> 151)
>>>>         at org.apache.cayenne.util.ObjectContextQueryAction.<init>
>>>> (ObjectContextQueryAction.java:69)
>>>>         at org.apache.cayenne.access.DataContextQueryAction.<init>
>>>> (DataContextQueryAction.java:46)
>>>>         at org.apache.cayenne.access.DataContext.onQuery
>>>> (DataContext.java:1387)
>>>>         at org.apache.cayenne.access.DataContext.performQuery
>>>> (DataContext.java:1376)
>>>>         at ch.rodano.msbase.model.Patient.patientWithPKInContext
>>>> (Patient.java:30)
>>>>
>>>> I am not certain how to check the line were it crashed (looking at
>>>> the code repository on-line does not probably garantee the line
>>>> number is the same).
>>>>
>>>> We are simply trying to get a list of objects:
>>>>
>>>>      SelectQuery allPatients = new SelectQuery(Patient.class);
>>>>      List patients = dataContext.performQuery(allPatients);
>>>>
>>>> Probably something is wrong with our model, but what? How to find
>>>> out?
>>>> The only different thing we did (which we did already  
>>>> previously) is
>>>> that the primary key for Patient is a varchar (String) and is not
>>>> hidden in the Java Class.
>>>>
>>>> Thanks for any hints (we regenerated everyting, etc... always the
>>>> same crash)
>>>>
>>>> Alex
>>
>>