Re: Null pointer in Cayenne 2.0.3 code

From: Michael Gentry (blacknex..mail.com)
Date: Fri Aug 31 2007 - 12:23:28 EDT


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. :-)

/dev/mrg

On 8/31/07, Alexander Lamb (dev) <alam..ac.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) <alam..ac.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
>
>



This archive was generated by hypermail 2.0.0 : Fri Aug 31 2007 - 12:24:05 EDT