Yeah, since "exists" is a fairly new feature in Cayenne, there are some holes. In-memory evaluation in particular:
https://github.com/apache/cayenne/blob/master/cayenne/src/main/java/org/apache/cayenne/exp/parser/ASTExists.java#L45 I am a big +1 to implement it in 5.0. We'll discuss with Nikita. Thanks, Andrus > On Sep 28, 2025, at 12:58 PM, Ricardo Parada <[email protected]> wrote: > > Thank you Nikita, that helps me. > > In EOF we use them in memory as well as for fetching from the database. > > In Cayenne it seems that once I call exists() then the expression cannot be > used for filtering in memory. > > For example: > > Expression expr = exp("paintings.name like 'S%'").exists(); > > List<Artist> someArtists = ObjectSelect > .query(Artist.class) > .where(expr) > .select(context); > > The above matches 1 artist, e.g. “Vincent Van Gogh” who has a paintings > starting with the letter S, e.g. Starry Night and Sunflowers. But when I use > that same expression against a list of all the artists like this: > > List<Artist> someArtists2 = expr.filterObjects(allArtists); > > Then someArtists2 is empty. > > However, if I rewrite the code as follows: > > Expression expr = exp("paintings.name like 'S%'"); > > List<Artist> someArtists = ObjectSelect > .query(Artist.class) > .where(expr.exists()) > .select(context); > > // This matches 1 artist > List<Artist> someArtists2 = expr.filterObjects(allArtists); > > > > Regards, > Ricardo Parada > > > >> On Sep 27, 2025, at 12:26 PM, Nikita Timofeev <[email protected]> >> wrote: >> >> Hi Ricardo, >> >> Yeah, there's not much info on that since that's a new API. `exists()` is a >> terminal operator that converts the whole expression to an EXISTS query. >> >> So it would be something like this in your >> example: Artist.PAINTINGS.dot(Painting.NAME).like("painting%").exists() >> >> >> On Fri, Sep 26, 2025 at 8:31 PM Ricardo Parada <[email protected]> >> wrote: >> >>> Hi all, >>> >>> Another question I have is regarding EXISTS expressions. I’m not sure if >>> I’m using the API correctly, but I was thinking it would be something like >>> this. Using the entities from the Tutorial, let’s say I want to fetch the >>> Artist’s that have a painting starting with the letter ‘G’: >>> >>> Expression e = Artist.PAINTINGS.exists(Painting.NAME.like(“G%”)); >>> >>> But I’m getting a syntax error. >> >> >> >> -- >> Best regards, >> Nikita Timofeev >
