Hey Todd,

There are a few different things you can do here:

1. Use the parent-pk filter. It looks something like this:

query = pm.newQuery("select from Account " +
                                "where parent-pk == keyParam " +
                                "parameters Key keyParam");

There's a groups thread about this here:
http://groups.google.com/group/google-appengine-java/browse_thread/thread/97ba3209ec6a65de

and the docs are here:

http://code.google.com/appengine/docs/java/datastore/transactions.html#Using_Transactions(search

2. Use the low-level API.

com.google.appengine.api.datastore.Query has a constructor that takes an
Ancestor key.
http://code.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/Query.html#Query(com.google.appengine.api.datastore.Key)

Hope this helps.

On Mon, Nov 16, 2009 at 4:29 PM, Todd Vierling <t...@duh.org> wrote:

> Test app to reproduce:
>
> http://ancestortest.latest.duh-test.appspot.com/
>
> Source code:
>
>
> http://ancestortest.latest.duh-test.appspot.com/src/ancestortest/AncestorTestServlet.java
>
> http://ancestortest.latest.duh-test.appspot.com/src/ancestortest/UserAccount.java
>
> http://ancestortest.latest.duh-test.appspot.com/src/ancestortest/UserAccountModification.java
>
> This sample code basically creates two UserAccount objects and
> attaches a UserAccountModification to one of them.  Then, a query
> (which, unless the datastore is really slow, should return an empty
> list):
>
> =====
>            Query q = em.createQuery("select m from
> UserAccountModification m where m.modTime < :newest and m.owner
> = :owner order by modTime desc");
>            q.setParameter("newest", System.currentTimeMillis() -
> 10000L);
>            q.setParameter("owner", user1);
>            List<UserAccountModification> mods = q.getResultList();
> =====
>
> I get the following exception:
>
> javax.persistence.PersistenceException: SELECT FROM
> UserAccountModification m WHERE m.modTime < :newest and m.owner
> = :owner ORDER BY modTime desc: Key of parameter value does not have a
> parent.
>        at
> org.datanucleus.jpa.NucleusJPAHelper.getJPAExceptionForNucleusException
> (NucleusJPAHelper.java:264)
>        at org.datanucleus.jpa.JPAQuery.getResultList(JPAQuery.java:179)
>        at ancestortest.AncestorTestServlet.doGet(AncestorTestServlet.java:
> 46)
>
> I must be missing something here.  The docs for GAE talk about
> ensuring the use of ancestor filters when inside a transaction, for
> instance, and there's the ANCESTOR IS operator in GQL.  However, I
> can't seem to figure out how properly to express this in JPQL (as
> "ANCESTOR IS" is a syntax error there), and there's no docs that I can
> find on doing this in JPA.
>
> The query is meant to find UserAccountModification objects all
> residing under a given "owner", which happens to be the ancestor of
> those objects.  Is there a proper expression for this using JPQL?
>
> --
>
> 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<google-appengine-java%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/google-appengine-java?hl=.
>
>
>


-- 
Ikai Lan
Developer Programs Engineer, Google App Engine

--

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=.


Reply via email to