An immutable object representing both the query and the result. The result is obtained lazily when one of the methods
in this interface is executed first time. The query is executed only once. Further calls will just return the
previously cached results. If you intend to re-execute the query to obtain fresh data you need to build another
instance using a QueryBuilder.