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

paa.coder.noodleCriteriaBuilder.queryBuilder.UpdateQuery Maven / Gradle / Ivy

package paa.coder.noodleCriteriaBuilder.queryBuilder;

import org.hibernate.query.Query;
import paa.coder.noodleCriteriaBuilder.NoodleFactory;
import paa.coder.noodleCriteriaBuilder.interfaces.NoodlePredicate;
import paa.coder.noodleCriteriaBuilder.queryBuilder.expressions.SetterBuilder;
import paa.coder.noodleCriteriaBuilder.queryBuilder.specifications.NoodleSpecificationBuilder;

import javax.persistence.criteria.*;
import java.util.function.Function;

public class UpdateQuery extends NoodleAbstractQuery {

    protected final Class from;
    private final SetterBuilder setterBuilder;

    public UpdateQuery(Class from, NoodleFactory noodleFactory){
        super(noodleFactory);
        this.from = from;
        this.setterBuilder = new SetterBuilder(noodleFactory);
    }

    @Override
    public UpdateQuery where(Function fPred){
        super.where(fPred);
        return this;
    }

    private  void set(Path p, Expression expression, CriteriaUpdate update){
        update.set(p, expression.as(p.getJavaType()));
    }

    public UpdateQuery set(Function uFunc){
        uFunc.apply(setterBuilder);
        return this;
    }

    public Query query(){
        CriteriaUpdate update = noodleFactory.getSession().getCriteriaBuilder().createCriteriaUpdate(from);

        Root root = update.from(from);
        setterBuilder
                .getMapExpressions()
                .forEach((k, v) -> k
                        .apply(pathFinder(root), update, noodleFactory.getSession().getCriteriaBuilder())
                        .ifPresent(field -> v
                                .apply(field)
                                .apply(pathFinder(root), update, noodleFactory.getSession().getCriteriaBuilder())
                                .ifPresent(exp -> set(field, exp, update))));

        getWherePredicates(root, update, noodleFactory.getSession().getCriteriaBuilder()).ifPresent(update::where);
        return noodleFactory.getSession().createQuery(update);
    }

    public Integer updateForce(){
        return query().executeUpdate();
    }

    public Integer update(){
        find(from).forEach(i->noodleFactory.getSession().detach(i));
        return  updateForce();
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy