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 super X, Y> attribute) {
return this.join(attribute, JoinType.INNER);
}
@Override
default FromValue> join(SingularAttribute super X, Y> attribute, JoinType joinType) {
return this.join(attribute, joinType, join -> null);
}
@Override
default FromValue> join(SingularAttribute super X, Y> attribute, JoinType joinType,
Function super Join, ? 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 super S> peeker);
@Override
> FromValue bind(Ref ref, Function super S, ? extends S2> refFunction);
@Override
FromValue filter(SingularAttribute super X, Boolean> attribute);
@Override
FromValue filter(Function super S, ? extends Expression> 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 extends ParamBinding>> params);
@Override
FromValue withLoadGraph(String name);
@Override
FromValue withFetchGraph(String name);
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy