Search in sources :

Example 1 with LiteralHandlingMode

use of org.hibernate.query.criteria.LiteralHandlingMode in project hibernate-orm by hibernate.

the class CriteriaCompiler method compile.

public QueryImplementor compile(CompilableCriteria criteria) {
    try {
        criteria.validate();
    } catch (IllegalStateException ise) {
        throw new IllegalArgumentException("Error occurred validating the Criteria", ise);
    }
    final Map<ParameterExpression<?>, ExplicitParameterInfo<?>> explicitParameterInfoMap = new HashMap<>();
    final List<ImplicitParameterBinding> implicitParameterBindings = new ArrayList<>();
    final SessionFactoryImplementor sessionFactory = entityManager.getSessionFactory();
    final LiteralHandlingMode criteriaLiteralHandlingMode = sessionFactory.getSessionFactoryOptions().getCriteriaLiteralHandlingMode();
    final Dialect dialect = sessionFactory.getServiceRegistry().getService(JdbcServices.class).getDialect();
    RenderingContext renderingContext = new RenderingContext() {

        private int aliasCount;

        private int explicitParameterCount;

        public String generateAlias() {
            return "generatedAlias" + aliasCount++;
        }

        public String generateParameterName() {
            return "param" + explicitParameterCount++;
        }

        @Override
        @SuppressWarnings("unchecked")
        public ExplicitParameterInfo registerExplicitParameter(ParameterExpression<?> criteriaQueryParameter) {
            ExplicitParameterInfo parameterInfo = explicitParameterInfoMap.get(criteriaQueryParameter);
            if (parameterInfo == null) {
                if (StringHelper.isNotEmpty(criteriaQueryParameter.getName())) {
                    parameterInfo = new ExplicitParameterInfo(criteriaQueryParameter.getName(), null, criteriaQueryParameter.getJavaType());
                } else if (criteriaQueryParameter.getPosition() != null) {
                    parameterInfo = new ExplicitParameterInfo(null, criteriaQueryParameter.getPosition(), criteriaQueryParameter.getJavaType());
                } else {
                    parameterInfo = new ExplicitParameterInfo(generateParameterName(), null, criteriaQueryParameter.getJavaType());
                }
                explicitParameterInfoMap.put(criteriaQueryParameter, parameterInfo);
            }
            return parameterInfo;
        }

        public String registerLiteralParameterBinding(final Object literal, final Class javaType) {
            final String parameterName = generateParameterName();
            final ImplicitParameterBinding binding = new ImplicitParameterBinding() {

                public String getParameterName() {
                    return parameterName;
                }

                public Class getJavaType() {
                    return javaType;
                }

                public void bind(TypedQuery typedQuery) {
                    typedQuery.setParameter(parameterName, literal);
                }
            };
            implicitParameterBindings.add(binding);
            return parameterName;
        }

        public String getCastType(Class javaType) {
            SessionFactoryImplementor factory = entityManager.getFactory();
            Type hibernateType = factory.getTypeResolver().heuristicType(javaType.getName());
            if (hibernateType == null) {
                throw new IllegalArgumentException("Could not convert java type [" + javaType.getName() + "] to Hibernate type");
            }
            return hibernateType.getName();
        }

        @Override
        public Dialect getDialect() {
            return dialect;
        }

        @Override
        public LiteralHandlingMode getCriteriaLiteralHandlingMode() {
            return criteriaLiteralHandlingMode;
        }
    };
    return criteria.interpret(renderingContext).buildCompiledQuery(entityManager, new InterpretedParameterMetadata() {

        @Override
        public Map<ParameterExpression<?>, ExplicitParameterInfo<?>> explicitParameterInfoMap() {
            return explicitParameterInfoMap;
        }

        @Override
        public List<ImplicitParameterBinding> implicitParameterBindings() {
            return implicitParameterBindings;
        }
    });
}
Also used : HashMap(java.util.HashMap) TypedQuery(javax.persistence.TypedQuery) SessionFactoryImplementor(org.hibernate.engine.spi.SessionFactoryImplementor) LiteralHandlingMode(org.hibernate.query.criteria.LiteralHandlingMode) ArrayList(java.util.ArrayList) JdbcServices(org.hibernate.engine.jdbc.spi.JdbcServices) Type(org.hibernate.type.Type) ParameterExpression(javax.persistence.criteria.ParameterExpression) Dialect(org.hibernate.dialect.Dialect) ArrayList(java.util.ArrayList) List(java.util.List) HashMap(java.util.HashMap) Map(java.util.Map)

Aggregations

ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Map (java.util.Map)1 TypedQuery (javax.persistence.TypedQuery)1 ParameterExpression (javax.persistence.criteria.ParameterExpression)1 Dialect (org.hibernate.dialect.Dialect)1 JdbcServices (org.hibernate.engine.jdbc.spi.JdbcServices)1 SessionFactoryImplementor (org.hibernate.engine.spi.SessionFactoryImplementor)1 LiteralHandlingMode (org.hibernate.query.criteria.LiteralHandlingMode)1 Type (org.hibernate.type.Type)1