The query returns no result.

            ApiProxy.setEnvironmentForCurrentThread(new TestEnvironment
());
            ApiProxy.setDelegate(new ApiProxyLocalImpl(new File("."))
{
            });
            A a = new A("A");
            B b = new B("B");
            a.getBs().add(b);
            PersistenceManagerFactory pmf =
JDOHelper.getPersistenceManagerFactory("transactions-optional");
            PersistenceManager pm = pmf.getPersistenceManager();
            Transaction tx = pm.currentTransaction();
            try {
                tx.begin();
                pm.makePersistent(a);
                tx.commit();
            } finally {
                if (tx.isActive()) {
                    tx.rollback();
                }
            }

            System.out.println(a.getKey());
            A ap = pm.getObjectById(A.class, "A");
            System.out.println(ap.getKey());
            Query query = pm.newQuery(B.class);
            query.setFilter("name == nameParam");
            query.declareParameters("String nameParam");
            List<B> rs = (List<B>) query.execute("B");
            System.out.println(rs.size());


On Jan 23, 12:20 am, John Patterson <jdpatter...@gmail.com> wrote:
> Execute a query on the name property of B rather than loading it by  
> key.  If the name is unique the result should only contain one B.
>
> On 23 Jan 2010, at 11:41,Sydneywrote:
>
>
>
> > I have a one to many relationship. There is a problem in the way I
> > query for a B object. I was wondering what is the best way (most
> > efficient) to do that.
>
> > A a = new A("A");
> > B b = new B("B");
> > a.getBs().add(b);
> > pm.makePersistent(a); // it's done inside a transaction
> > A ap = pm.getObjectById(A.class, "A"); // FINE
> > B bp = pm.getObjectById(B.class, "B"); // NOT FOUND Exception
>
> > I guess B is not found because the real key is not B but B + A key.
> > How do you get the B object when you don't know nothing about A?
>
> > public class A {
>
> >   �...@primarykey
> >   �...@persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
> >   �...@extension(vendorName = "datanucleus", key = "gae.encoded-pk",
> > value = "true")
> >    private String key;
> >   �...@persistent
> >   �...@extension(vendorName = "datanucleus", key = "gae.pk-name", value
> > = "true")
> >    private String name;
> >   �...@persistent(mappedBy = "a")
> >    private List<B> bs;
>
> >    public A(String name) {
> >        this.name = name;
> >        bs = new ArrayList<B>();
> >    }
> > ... Getter/Setter
> > }
>
> > @PersistenceCapable(identityType =
> > javax.jdo.annotations.IdentityType.APPLICATION)
> > public class B {
>
> >   �...@primarykey
> >   �...@persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
> >   �...@extension(vendorName = "datanucleus", key = "gae.encoded-pk",
> > value = "true")
> >    private String key;
> >   �...@persistent
> >   �...@extension(vendorName = "datanucleus", key = "gae.pk-name", value
> > = "true")
> >    private String name;
> >   �...@persistent
> >    private A a;
>
> >    public B(String name) {
> >        this.name = name;
> >    }
> > ... Getter/Setter
> > }
>
> > --
> > You received this message because you are subscribed to the Google  
> > Groups "Google App Engine for Java" group.
> > To post to this group, send email to google-appengine-java@googlegroups.com
> > .
> > To unsubscribe from this group, send email to 
> > google-appengine-java+unsubscr...@googlegroups.com
> > .
> > For more options, visit this group 
> > athttp://groups.google.com/group/google-appengine-java?hl=en
> > .

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine for Java" group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.

Reply via email to