/* * Copyright 2015, The Querydsl Team (http://www.querydsl.com/team) * * Licensed 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 com.querydsl.core.types; import java.util.Map; import com.google.common.collect.ImmutableList; /** * Factory class for {@link FactoryExpression} instances * * @author tiwe * */ public final class Projections { /** * Create a typed array projection for the given type and expressions * * @param <T> type of projection * @param type type of the projection * @param exprs arguments for the projection * @return factory expression */ public static <T> ArrayConstructorExpression<T> array(Class<T[]> type, Expression<T>... exprs) { return new ArrayConstructorExpression<T>(type, exprs); } /** * Create an appending factory expression which serializes all the arguments but the uses * the base value as the return value * * @param base first argument * @param rest additional arguments * @param <T> type of projection * @return factory expression */ public static <T> AppendingFactoryExpression<T> appending(Expression<T> base, Expression<?>... rest) { return new AppendingFactoryExpression<T>(base, rest); } /** * Create a Bean populating projection for the given type and expressions * * <p>Example</p> * <pre> * UserDTO dto = query.select( * Projections.bean(UserDTO.class, user.firstName, user.lastName)); * </pre> * * @param <T> type of projection * @param type type of the projection * @param exprs arguments for the projection * @return factory expression */ public static <T> QBean<T> bean(Class<? extends T> type, Expression<?>... exprs) { return new QBean<T>(type, exprs); } /** * Create a Bean populating projection for the given type and expressions * * @param <T> type of projection * @param type type of the projection * @param exprs arguments for the projection * @return factory expression */ public static <T> QBean<T> bean(Path<? extends T> type, Expression<?>... exprs) { return new QBean<T>(type.getType(), exprs); } /** * Create a Bean populating projection for the given type and bindings * * @param <T> type of projection * @param type type of the projection * @param bindings property bindings * @return factory expression */ public static <T> QBean<T> bean(Path<? extends T> type, Map<String, ? extends Expression<?>> bindings) { return new QBean<T>(type.getType(), bindings); } /** * Create a Bean populating projection for the given type and bindings * * @param <T> type of projection * @param type type of the projection * @param bindings property bindings * @return factory expression */ public static <T> QBean<T> bean(Class<? extends T> type, Map<String, ? extends Expression<?>> bindings) { return new QBean<T>(type, bindings); } /** * Create a constructor invocation projection for the given type and expressions * * <p>Example</p> * <pre> * UserDTO dto = query.singleResult( * Projections.constructor(UserDTO.class, user.firstName, user.lastName)); * </pre> * * @param <T> type projection * @param type type of the projection * @param exprs arguments for the projection * @return factory expression */ public static <T> ConstructorExpression<T> constructor(Class<? extends T> type, Expression<?>... exprs) { return new ConstructorExpression<T>(type, exprs); } /** * Create a constructor invocation projection for given type, parameter types and expressions * * @param type type of the projection * @param paramTypes constructor parameter types * @param exprs constructor parameters * @param <T> type of projection * @return factory expression */ public static <T> ConstructorExpression<T> constructor(Class<? extends T> type, Class<?>[] paramTypes, Expression<?>... exprs) { return new ConstructorExpression<T>(type, paramTypes, exprs); } /** * Create a constructor invocation projection for given type, parameter types and expressions * * @param type type of the projection * @param paramTypes constructor parameter types * @param exprs constructor parameters * @param <T> type of projection * @return factory expression */ public static <T> ConstructorExpression<T> constructor(Class<? extends T> type, Class<?>[] paramTypes, ImmutableList<Expression<?>> exprs) { return new ConstructorExpression<T>(type, paramTypes, exprs); } /** * Create a field access based Bean populating projection for the given type and expressions * * <p>Example</p> * <pre> * UserDTO dto = query.singleResult( * Projections.fields(UserDTO.class, user.firstName, user.lastName)); * </pre> * * @param <T> type of projection * @param type type of the projection * @param exprs arguments for the projection * @return factory expression */ public static <T> QBean<T> fields(Class<? extends T> type, Expression<?>... exprs) { return new QBean<T>(type, true, exprs); } /** * Create a field access based Bean populating projection for the given type and expressions * * @param <T> type of projection * @param type type of the projection * @param exprs arguments for the projection * @return factory expression */ public static <T> QBean<T> fields(Path<? extends T> type, Expression<?>... exprs) { return new QBean<T>(type.getType(), true, exprs); } /** * Create a field access based Bean populating projection for the given type and bindings * * @param <T> type of projection * @param type type of the projection * @param bindings field bindings * @return factory expression */ public static <T> QBean<T> fields(Path<? extends T> type, Map<String, ? extends Expression<?>> bindings) { return new QBean<T>(type.getType(), true, bindings); } /** * Create a field access based Bean populating projection for the given type and bindings * * @param <T> type of projection * @param type type of the projection * @param bindings field bindings * @return factory expression */ public static <T> QBean<T> fields(Class<? extends T> type, Map<String, ? extends Expression<?>> bindings) { return new QBean<T>(type, true, bindings); } /** * Create a new List typed projection for the given expressions * * @param args list elements * @return factory expression */ public static QList list(Expression<?>... args) { return new QList(args); } /** * Create a new List typed projection for the given expressions * * @param args list elements * @return factory expression */ public static QList list(ImmutableList<Expression<?>> args) { return new QList(args); } /** * Create a new List typed projection for the given expressions * * @param args list elements * @return factory expression */ public static QList list(Expression<?>[]... args) { return new QList(args); } /** * Create a Map typed projection for the given expressions * * <p>Example</p> * <pre>{@code * Map<Expression<?>, ?> map = query.select( * Projections.map(user.firstName, user.lastName)); * }</pre> * * @param exprs arguments for the projection * @return factory expression */ public static QMap map(Expression<?>... exprs) { return new QMap(exprs); } /** * Create a Tuple typed projection for the given expressions * * @param exprs arguments for the projection * @return factory expression */ public static QTuple tuple(Expression<?>... exprs) { return new QTuple(exprs); } /** * Create a Tuple typed projection for the given expressions * * @param exprs arguments for the projection * @return factory expression */ public static QTuple tuple(ImmutableList<Expression<?>> exprs) { return new QTuple(exprs); } /** * Create a Tuple typed projection for the given expressions * * @param exprs arguments for the projection * @return factory expression */ public static QTuple tuple(Expression<?>[]... exprs) { return new QTuple(exprs); } private Projections() { } }