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

com.github.fluent.hibernate.HibernateHqlRequest Maven / Gradle / Ivy

package com.github.fluent.hibernate;

import java.util.Arrays;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import com.github.fluent.hibernate.util.InternalUtils;

/**
 * @param 
 *            type of return value.
 *
 * @author DoubleF1re
 * @author V.Ladynev
 */
public final class HibernateHqlRequest {

    private final String query;

    private final HibernateQueryParameters params = new HibernateQueryParameters();

    private int maxResults;

    private Class transformToClass;

    private HibernateHqlRequest(String query) {
        this.query = query;
    }

    /**
     * Add a named query parameter.
     *
     * @param name
     *            name of parameter
     * @param val
     *            parameter value
     */
    public HibernateHqlRequest p(String name, Object val) {
        params.add(name, val);
        return this;
    }

    public HibernateHqlRequest p(String name, Object... vals) {
        params.add(name, Arrays.asList(vals));
        return this;
    }

    public HibernateHqlRequest maxResults(int maxResults) {
        this.maxResults = maxResults;
        return this;
    }

    // TODO transformer not works for pid a nested fields
    public HibernateHqlRequest transform(Class clazz) {
        transformToClass = clazz;
        return this;
    }

    public T first() {
        return InternalUtils.CollectionUtils.first(list());
    }

    public List list() {
        return HibernateSessionFactory.doInTransaction(new IRequest>() {
            @Override
            public List doInTransaction(Session session) {
                return tuneForSelect(createHibernateQuery(session)).list();
            }
        });
    }

    private Query tuneForSelect(Query hibernateQuery) {
        if (maxResults != 0) {
            hibernateQuery.setMaxResults(maxResults);
        }

        if (transformToClass != null) {
            hibernateQuery.setResultTransformer(new FluentHibernateResultTransformer(
                    transformToClass));
        }

        return hibernateQuery;
    }

    // TODO may be return long?
    public int count() {
        Number result = HibernateSessionFactory.doInTransaction(new IRequest() {
            @Override
            public Number doInTransaction(Session session) {
                return (Number) createHibernateQuery(session).iterate().next();
            }
        });

        return result == null ? 0 : result.intValue();
    }

    private Query createHibernateQuery(Session session) {
        Query result = session.createQuery(query);
        params.setParametersToQuery(result);
        return result;
    }

    public static  HibernateHqlRequest create(String query) {
        return new HibernateHqlRequest(query);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy