/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.deltaspike.data.api; import java.util.List; import javax.persistence.FlushModeType; import javax.persistence.LockModeType; import javax.persistence.metamodel.SingularAttribute; /** * Can be used as query result type, which will not execute the query immediately. * Allows some post processing like defining query ordering. * * @param <E> Entity type */ public interface QueryResult<E> { /** * Sort the query result ascending by the given entity singular attribute. * This is the typesafe version, alternatively a {@link #orderAsc(String)} * String can be used. * * @param attribute Sort attribute. * @return Fluent API: the result instance. */ <X> QueryResult<E> orderAsc(SingularAttribute<E, X> attribute); /** * Sort the query result ascending by the given entity singular attribute. * This is the typesafe version, alternatively a {@link #orderAsc(String)} * String can be used. * * @param attribute Sort attribute. * @param appendEntityName whether the entity name 'e' should be appended to this attribute * @return Fluent API: the result instance. */ <X> QueryResult<E> orderAsc(SingularAttribute<E, X> attribute, boolean appendEntityName); /** * Sort the query result ascending by the given entity attribute. * * @param attribute Sort attribute. * @return Fluent API: the result instance. */ QueryResult<E> orderAsc(String attribute); /** * Sort the query result ascending by the given entity attribute. * * @param attribute Sort attribute. * @param appendEntityName whether the entity name 'e' should be appended to this attribute * @return Fluent API: the result instance. */ QueryResult<E> orderAsc(String attribute, boolean appendEntityName); /** * Sort the query result descending by the given entity singular attribute. * This is the typesafe version, alternatively a {@link #orderDesc(String)} * String can be used. * * @param attribute Sort attribute. * @return Fluent API: the result instance. */ <X> QueryResult<E> orderDesc(SingularAttribute<E, X> attribute); /** * Sort the query result descending by the given entity singular attribute. * This is the typesafe version, alternatively a {@link #orderDesc(String)} * String can be used. * * @param attribute Sort attribute. * @param appendEntityName whether the entity name 'e' should be appended to this attribute * @return Fluent API: the result instance. */ <X> QueryResult<E> orderDesc(SingularAttribute<E, X> attribute, boolean appendEntityName); /** * Sort the query result descending by the given entity attribute. * * @param attribute Sort attribute. * @return Fluent API: the result instance. */ QueryResult<E> orderDesc(String attribute); /** * Sort the query result descending by the given entity attribute. * * @param attribute Sort attribute. * @param appendEntityName whether the entity name 'e' should be appended to this attribute * @return Fluent API: the result instance. */ QueryResult<E> orderDesc(String attribute, boolean appendEntityName); /** * Revert an existing order attribute sort direction. Defaults to ascending * order if the sort attribute was not used before. * * @param attribute Sort attribute. * @return Fluent API: the result instance. */ <X> QueryResult<E> changeOrder(SingularAttribute<E, X> attribute); /** * Remove any ordering from the query result object. * * @return Fluent API: the result instance. */ QueryResult<E> clearOrder(); /** * Revert an existing order attribute sort direction. Defaults to ascending * order if the sort attribute was not used before. * * @param attribute Sort attribute. * @return Fluent API: the result instance. */ QueryResult<E> changeOrder(String attribute); /** * Limit the number of results returned by the query. * * @param max Max number of results. * @return Fluent API: the result instance. */ QueryResult<E> maxResults(int max); /** * Pagination: Set the result start position. * * @param first Result start position. * @return Fluent API: the result instance. */ QueryResult<E> firstResult(int first); /** * Sets the query lock mode. * * @param lockMode Query lock mode to use in the query. * @return Fluent API: the result instance. */ QueryResult<E> lockMode(LockModeType lockMode); /** * Sets the query flush mode. * * @param flushMode Query flush mode to use in the query. * @return Fluent API: the result instance. */ QueryResult<E> flushMode(FlushModeType flushMode); /** * Apply a query hint to the query to execute. * * @param hint Hint name. * @param value Hint value. * @return Fluent API: the result instance. */ QueryResult<E> hint(String hint, Object value); /** * Fetch the result set. * * @return List of entities retrieved by the query. */ List<E> getResultList(); /** * Fetch a single result entity. * * @return Entity retrieved by the query. */ E getSingleResult(); /** * Fetch a single result entity. Returns {@code null} if no result is found. * * @return Entity retrieved by the query, or {@code null} if no result. */ E getOptionalResult(); /** * Fetch a single result entity. Returns {@code null} if no result is found. If the * query finds multiple results, it simply returns the first one found. * * @return First Entity retrieved by the query, or {@code null} if no result. */ E getAnyResult(); /** * Count the result set. * * @return Result count. */ long count(); /** * Set a page size on the query result. Defaults to 10 or takes the value of a * previous {@link #maxResults(int)} call. * * @param pageSize Page size for further queries. * @return Fluent API: the result instance. */ QueryResult<E> withPageSize(int pageSize); /** * Move the page cursor to a specific page. * * @param page Page to move to for the next query. * @return Fluent API: the result instance. */ QueryResult<E> toPage(int page); /** * Move to the next page. * * @return Fluent API: the result instance. */ QueryResult<E> nextPage(); /** * Move to the previous page. * * @return Fluent API: the result instance. */ QueryResult<E> previousPage(); /** * Count the number of pages. * * @return Page count. */ int countPages(); /** * Return the actual page. * * @return Page position. */ int currentPage(); /** * Return the actual page size. * * @return Page size. */ int pageSize(); }