Search in sources :

Example 1 with NativeSQLSerializer

use of com.querydsl.jpa.NativeSQLSerializer in project querydsl by querydsl.

the class AbstractHibernateSQLQuery method createQuery.

private Query createQuery(boolean forCount) {
    NativeSQLSerializer serializer = (NativeSQLSerializer) serialize(forCount);
    String queryString = serializer.toString();
    logQuery(queryString, serializer.getConstantToLabel());
    org.hibernate.SQLQuery query = session.createSQLQuery(queryString);
    // set constants
    HibernateUtil.setConstants(query, serializer.getConstantToLabel(), queryMixin.getMetadata().getParams());
    if (!forCount) {
        ListMultimap<Expression<?>, String> aliases = serializer.getAliases();
        Set<String> used = Sets.newHashSet();
        // set entity paths
        Expression<?> projection = queryMixin.getMetadata().getProjection();
        if (projection instanceof FactoryExpression) {
            for (Expression<?> expr : ((FactoryExpression<?>) projection).getArgs()) {
                if (isEntityExpression(expr)) {
                    query.addEntity(extractEntityExpression(expr).toString(), expr.getType());
                } else if (aliases.containsKey(expr)) {
                    for (String scalar : aliases.get(expr)) {
                        if (!used.contains(scalar)) {
                            query.addScalar(scalar);
                            used.add(scalar);
                            break;
                        }
                    }
                }
            }
        } else if (isEntityExpression(projection)) {
            query.addEntity(extractEntityExpression(projection).toString(), projection.getType());
        } else if (aliases.containsKey(projection)) {
            for (String scalar : aliases.get(projection)) {
                if (!used.contains(scalar)) {
                    query.addScalar(scalar);
                    used.add(scalar);
                    break;
                }
            }
        }
        // set result transformer, if projection is a FactoryExpression instance
        if (projection instanceof FactoryExpression) {
            query.setResultTransformer(new FactoryExpressionTransformer((FactoryExpression<?>) projection));
        }
    }
    if (fetchSize > 0) {
        query.setFetchSize(fetchSize);
    }
    if (timeout > 0) {
        query.setTimeout(timeout);
    }
    if (cacheable != null) {
        query.setCacheable(cacheable);
    }
    if (cacheRegion != null) {
        query.setCacheRegion(cacheRegion);
    }
    if (readOnly != null) {
        query.setReadOnly(readOnly);
    }
    return query;
}
Also used : FactoryExpression(com.querydsl.core.types.FactoryExpression) FactoryExpression(com.querydsl.core.types.FactoryExpression) Expression(com.querydsl.core.types.Expression) FactoryExpressionTransformer(com.querydsl.jpa.FactoryExpressionTransformer) NativeSQLSerializer(com.querydsl.jpa.NativeSQLSerializer) org.hibernate(org.hibernate)

Example 2 with NativeSQLSerializer

use of com.querydsl.jpa.NativeSQLSerializer in project querydsl by querydsl.

the class AbstractJPASQLQuery method createQuery.

private Query createQuery(boolean forCount) {
    NativeSQLSerializer serializer = (NativeSQLSerializer) serialize(forCount);
    String queryString = serializer.toString();
    logQuery(queryString, serializer.getConstantToLabel());
    Expression<?> projection = queryMixin.getMetadata().getProjection();
    Query query;
    if (!FactoryExpression.class.isAssignableFrom(projection.getClass()) && isEntityExpression(projection)) {
        if (queryHandler.createNativeQueryTyped()) {
            query = entityManager.createNativeQuery(queryString, projection.getType());
        } else {
            query = entityManager.createNativeQuery(queryString);
        }
    } else {
        query = entityManager.createNativeQuery(queryString);
    }
    if (!forCount) {
        ListMultimap<Expression<?>, String> aliases = serializer.getAliases();
        Set<String> used = Sets.newHashSet();
        if (projection instanceof FactoryExpression) {
            for (Expression<?> expr : ((FactoryExpression<?>) projection).getArgs()) {
                if (isEntityExpression(expr)) {
                    queryHandler.addEntity(query, extractEntityExpression(expr).toString(), expr.getType());
                } else if (aliases.containsKey(expr)) {
                    for (String scalar : aliases.get(expr)) {
                        if (!used.contains(scalar)) {
                            queryHandler.addScalar(query, scalar, expr.getType());
                            used.add(scalar);
                            break;
                        }
                    }
                }
            }
        } else if (isEntityExpression(projection)) {
            queryHandler.addEntity(query, extractEntityExpression(projection).toString(), projection.getType());
        } else if (aliases.containsKey(projection)) {
            for (String scalar : aliases.get(projection)) {
                if (!used.contains(scalar)) {
                    queryHandler.addScalar(query, scalar, projection.getType());
                    used.add(scalar);
                    break;
                }
            }
        }
    }
    if (lockMode != null) {
        query.setLockMode(lockMode);
    }
    if (flushMode != null) {
        query.setFlushMode(flushMode);
    }
    for (Map.Entry<String, Object> entry : hints.entries()) {
        query.setHint(entry.getKey(), entry.getValue());
    }
    // set constants
    JPAUtil.setConstants(query, serializer.getConstantToLabel(), queryMixin.getMetadata().getParams());
    // necessary when query is reused
    this.projection = null;
    if (projection instanceof FactoryExpression) {
        if (!queryHandler.transform(query, (FactoryExpression<?>) projection)) {
            this.projection = (FactoryExpression<?>) projection;
        }
    }
    return query;
}
Also used : FactoryExpression(com.querydsl.core.types.FactoryExpression) AbstractSQLQuery(com.querydsl.jpa.AbstractSQLQuery) Query(javax.persistence.Query) FactoryExpression(com.querydsl.core.types.FactoryExpression) Expression(com.querydsl.core.types.Expression) NativeSQLSerializer(com.querydsl.jpa.NativeSQLSerializer) Map(java.util.Map)

Aggregations

Expression (com.querydsl.core.types.Expression)2 FactoryExpression (com.querydsl.core.types.FactoryExpression)2 NativeSQLSerializer (com.querydsl.jpa.NativeSQLSerializer)2 AbstractSQLQuery (com.querydsl.jpa.AbstractSQLQuery)1 FactoryExpressionTransformer (com.querydsl.jpa.FactoryExpressionTransformer)1 Map (java.util.Map)1 Query (javax.persistence.Query)1 org.hibernate (org.hibernate)1