All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.dellroad.querystream.jpa.FromValue Maven / Gradle / Ivy


/*
 * Copyright (C) 2018 Archie L. Cobbs. All rights reserved.
 */

package org.dellroad.querystream.jpa;

import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Function;

import javax.persistence.FlushModeType;
import javax.persistence.LockModeType;
import javax.persistence.Parameter;
import javax.persistence.TemporalType;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.From;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.Selection;
import javax.persistence.metamodel.SingularAttribute;

import org.dellroad.querystream.jpa.querytype.SearchType;

/**
 * A {@link FromStream} that is guaranteed to return at most a single result.
 */
public interface FromValue> extends PathValue, FromStream {

// Narrowing overrides (FromStream)

    @Override
    default  FromValue> join(SingularAttribute attribute) {
        return this.join(attribute, JoinType.INNER);
    }

    @Override
    default  FromValue> join(SingularAttribute attribute, JoinType joinType) {
        return this.join(attribute, joinType, join -> null);
    }

    @Override
    default  FromValue> join(SingularAttribute attribute, JoinType joinType,
      Function, ? extends Expression> on) {
        if (attribute == null)
            throw new IllegalArgumentException("null attribute");
        if (joinType == null)
            throw new IllegalArgumentException("null joinType");
        if (on == null)
            throw new IllegalArgumentException("null on");
        QueryStreamImpl.checkOffsetLimit(this, "join()");
        return new FromValueImpl<>(this.getEntityManager(), new SearchType<>(attribute.getJavaType()),
           (builder, query) -> {
            final Join join = this.configure(builder, query).join(attribute, joinType);
            final Expression onPredicate = on.apply(join);
            if (onPredicate != null)
                join.on(onPredicate);
            return join;
          },
          QueryInfo.of(this));
    }

// Narrowing overrides (QueryStream)

    @Override
    FromValue bind(Ref ref);

    @Override
    FromValue peek(Consumer peeker);

    @Override
    > FromValue bind(Ref ref, Function refFunction);

    @Override
    FromValue filter(SingularAttribute attribute);

    @Override
    FromValue filter(Function> predicateBuilder);

    @Override
    FromValue withFlushMode(FlushModeType flushMode);

    @Override
    FromValue withLockMode(LockModeType lockMode);

    @Override
    FromValue withHint(String name, Object value);

    @Override
    FromValue withHints(Map hints);

    @Override
     FromValue withParam(Parameter parameter, T value);

    @Override
    FromValue withParam(Parameter parameter, Date value, TemporalType temporalType);

    @Override
    FromValue withParam(Parameter parameter, Calendar value, TemporalType temporalType);

    @Override
    FromValue withParams(Iterable> params);

    @Override
    FromValue withLoadGraph(String name);

    @Override
    FromValue withFetchGraph(String name);
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy