Example usage for org.hibernate.persister.entity PropertyMapping toColumns

List of usage examples for org.hibernate.persister.entity PropertyMapping toColumns

Introduction

In this page you can find the example usage for org.hibernate.persister.entity PropertyMapping toColumns.

Prototype

public String[] toColumns(String alias, String propertyName) throws QueryException;

Source Link

Document

Obtain aliased column/formula fragments for the specified property path.

Usage

From source file:org.codehaus.groovy.grails.orm.hibernate.query.AbstractHibernateQuery.java

License:Apache License

org.hibernate.criterion.Criterion getRestrictionForFunctionCall(FunctionCallingCriterion criterion,
        PersistentEntity entity) {//from  www  .j a v a  2s. c o m
    org.hibernate.criterion.Criterion sqlRestriction;

    SessionFactory sessionFactory = ((IHibernateTemplate) session.getNativeInterface()).getSessionFactory();
    String property = criterion.getProperty();
    Criterion datastoreCriterion = criterion.getPropertyCriterion();
    PersistentProperty pp = entity.getPropertyByName(property);

    if (pp == null)
        throw new InvalidDataAccessResourceUsageException(
                "Cannot execute function defined in query [" + criterion.getFunctionName()
                        + "] on non-existent property [" + property + "] of [" + entity.getJavaClass() + "]");

    String functionName = criterion.getFunctionName();

    Dialect dialect = getDialect(sessionFactory);
    SQLFunction sqlFunction = dialect.getFunctions().get(functionName);
    if (sqlFunction != null) {
        TypeResolver typeResolver = getTypeResolver(sessionFactory);
        BasicType basic = typeResolver.basic(pp.getType().getName());
        if (basic != null && datastoreCriterion instanceof PropertyCriterion) {

            PropertyCriterion pc = (PropertyCriterion) datastoreCriterion;
            final org.hibernate.criterion.Criterion hibernateCriterion = createHibernateCriterionAdapter(
                    getEntity(), datastoreCriterion, alias).toHibernateCriterion(this);
            if (hibernateCriterion instanceof SimpleExpression) {
                SimpleExpression expr = (SimpleExpression) hibernateCriterion;
                Object op = ReflectionUtils.getField(opField, expr);
                PropertyMapping mapping = getEntityPersister(entity.getJavaClass().getName(), sessionFactory);
                String[] columns;
                if (alias != null) {
                    columns = mapping.toColumns(alias, property);
                } else {
                    columns = mapping.toColumns(property);
                }
                String root = render(basic, Arrays.asList(columns), sessionFactory, sqlFunction);
                Object value = pc.getValue();
                if (value != null) {
                    sqlRestriction = Restrictions.sqlRestriction(root + op + "?", value,
                            typeResolver.basic(value.getClass().getName()));
                } else {
                    sqlRestriction = Restrictions.sqlRestriction(root + op + "?", value, basic);
                }
            } else {
                throw new InvalidDataAccessResourceUsageException(
                        "Unsupported function [" + functionName + "] defined in query for property [" + property
                                + "] with type [" + pp.getType() + "]");
            }
        } else {
            throw new InvalidDataAccessResourceUsageException("Unsupported function [" + functionName
                    + "] defined in query for property [" + property + "] with type [" + pp.getType() + "]");
        }
    } else {
        throw new InvalidDataAccessResourceUsageException(
                "Unsupported function defined in query [" + functionName + "]");
    }
    return sqlRestriction;
}

From source file:org.grails.orm.hibernate.query.AbstractHibernateQuery.java

License:Apache License

org.hibernate.criterion.Criterion getRestrictionForFunctionCall(FunctionCallingCriterion criterion,
        PersistentEntity entity) {//  w  ww  .  j  a  v  a 2s  .c  o m
    org.hibernate.criterion.Criterion sqlRestriction;

    SessionFactory sessionFactory = ((IHibernateTemplate) session.getNativeInterface()).getSessionFactory();
    String property = criterion.getProperty();
    Criterion datastoreCriterion = criterion.getPropertyCriterion();
    PersistentProperty pp = entity.getPropertyByName(property);

    if (pp == null)
        throw new InvalidDataAccessResourceUsageException(
                "Cannot execute function defined in query [" + criterion.getFunctionName()
                        + "] on non-existent property [" + property + "] of [" + entity.getJavaClass() + "]");

    String functionName = criterion.getFunctionName();

    Dialect dialect = getDialect(sessionFactory);
    SQLFunction sqlFunction = dialect.getFunctions().get(functionName);
    if (sqlFunction != null) {
        TypeResolver typeResolver = getTypeResolver(sessionFactory);
        BasicType basic = typeResolver.basic(pp.getType().getName());
        if (basic != null && datastoreCriterion instanceof PropertyCriterion) {

            PropertyCriterion pc = (PropertyCriterion) datastoreCriterion;
            final org.hibernate.criterion.Criterion hibernateCriterion = getHibernateCriterionAdapter()
                    .toHibernateCriterion(this, datastoreCriterion, alias);
            if (hibernateCriterion instanceof SimpleExpression) {
                SimpleExpression expr = (SimpleExpression) hibernateCriterion;
                Object op = ReflectionUtils.getField(opField, expr);
                PropertyMapping mapping = getEntityPersister(entity.getJavaClass().getName(), sessionFactory);
                String[] columns;
                if (alias != null) {
                    columns = mapping.toColumns(alias, property);
                } else {
                    columns = mapping.toColumns(property);
                }
                String root = render(basic, Arrays.asList(columns), sessionFactory, sqlFunction);
                Object value = pc.getValue();
                if (value != null) {
                    sqlRestriction = Restrictions.sqlRestriction(root + op + "?", value,
                            typeResolver.basic(value.getClass().getName()));
                } else {
                    sqlRestriction = Restrictions.sqlRestriction(root + op + "?", value, basic);
                }
            } else {
                throw new InvalidDataAccessResourceUsageException(
                        "Unsupported function [" + functionName + "] defined in query for property [" + property
                                + "] with type [" + pp.getType() + "]");
            }
        } else {
            throw new InvalidDataAccessResourceUsageException("Unsupported function [" + functionName
                    + "] defined in query for property [" + property + "] with type [" + pp.getType() + "]");
        }
    } else {
        throw new InvalidDataAccessResourceUsageException(
                "Unsupported function defined in query [" + functionName + "]");
    }
    return sqlRestriction;
}