Hi,
I am using QuickPerf to monitor the number of queries that are executed behind the scenes. I noticed that in one of my scenario’s a, for me, unexpected query is executed. I am trying to understand it but I don’t get it. Perhaps somebody here knows the answer.
So I have a root entity named Project with the following relations:
- One to one with Client (Eager)
- One to one with Building (Eager)
- One to many with Window (Lazy)
- Many to one with Workspace (Eager)
I try to select all projects with some specific conditions + the number of windows.
CriteriaQuery<Tuple> criteriaQuery = criteriaBuilder.createTupleQuery();
Root<Project> from = criteriaQuery.from(Project.class);
from.fetch("client", JoinType.LEFT);
from.fetch("building", JoinType.LEFT);
from.fetch("workspace", JoinType.LEFT);
criteriaQuery.select(criteriaBuilder.tuple(from, criteriaBuilder.size(from.get("windows"))));
criteriaQuery.groupBy(from);
applyConditions(projectFilter, criteriaBuilder, criteriaQuery, from);
return query.getResultStream().map(this::combineProjectAndWindowTotal);
I have a unit test that creates 4 projects. The test should find 3 projects. For each project that was found I print the number of windows (so I iterate over the full result list).
I can see that 2 queries are executed:
- The select query to find the projects and the number of windows.
- A query to load a project - but only for the first project in the result list.
Why the second query? And why only for the first project in the result list?
I would have expected only the first query OR the second query for EVERY project in the result list.
Thanks