use of org.hibernate.sql.ast.tree.expression.Expression in project hibernate-orm by hibernate.
the class SqmParameterInterpretation method resolveSqlSelection.
public SqlSelection resolveSqlSelection(DomainResultCreationState creationState) {
final Expression resolvedExpression = getResolvedExpression();
if (resolvedExpression instanceof SqlTuple) {
throw new SemanticException("Composite query parameter cannot be used in select");
}
BindableType<?> nodeType = sqmParameter.getNodeType();
if (nodeType == null) {
final QueryParameterBinding<?> binding = queryParameterBindingResolver.apply(queryParameter);
nodeType = binding.getBindType();
}
final SessionFactoryImplementor sessionFactory = creationState.getSqlAstCreationState().getCreationContext().getSessionFactory();
final SqmExpressible<?> sqmExpressible = nodeType.resolveExpressible(sessionFactory);
return creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection(resolvedExpression, sqmExpressible.getExpressibleJavaType(), sessionFactory.getTypeConfiguration());
}
use of org.hibernate.sql.ast.tree.expression.Expression in project hibernate-orm by hibernate.
the class SmokeTests method testConvertedHqlInterpretation.
@Test
public void testConvertedHqlInterpretation(SessionFactoryScope scope) {
scope.inTransaction(session -> {
final JdbcTypeRegistry jdbcTypeRegistry = session.getFactory().getTypeConfiguration().getJdbcTypeRegistry();
final QueryImplementor<Gender> query = session.createQuery("select e.gender from SimpleEntity e", Gender.class);
final SqmQueryImplementor<Gender> hqlQuery = (SqmQueryImplementor<Gender>) query;
final SqmSelectStatement<Gender> sqmStatement = (SqmSelectStatement<Gender>) hqlQuery.getSqmStatement();
final StandardSqmTranslator<SelectStatement> sqmConverter = new StandardSqmTranslator<>(sqmStatement, hqlQuery.getQueryOptions(), ((QuerySqmImpl<?>) hqlQuery).getDomainParameterXref(), query.getParameterBindings(), session.getLoadQueryInfluencers(), scope.getSessionFactory(), true);
final SqmTranslation<SelectStatement> sqmInterpretation = sqmConverter.translate();
final SelectStatement sqlAst = sqmInterpretation.getSqlAst();
final FromClause fromClause = sqlAst.getQuerySpec().getFromClause();
assertThat(fromClause.getRoots().size(), is(1));
final TableGroup rootTableGroup = fromClause.getRoots().get(0);
assertThat(rootTableGroup.getPrimaryTableReference(), notNullValue());
assertThat(rootTableGroup.getPrimaryTableReference().getTableId(), is("mapping_simple_entity"));
assertThat(rootTableGroup.getTableReferenceJoins().size(), is(0));
assertThat(rootTableGroup.getTableGroupJoins().isEmpty(), is(true));
// `s` is the "alias stem" for `SimpleEntity` and as it is the first entity with that stem in
// the query the base becomes `s1`. The primary table reference is always suffixed as `_0`
assertThat(rootTableGroup.getPrimaryTableReference().getIdentificationVariable(), is("s1_0"));
final SelectClause selectClause = sqlAst.getQuerySpec().getSelectClause();
assertThat(selectClause.getSqlSelections().size(), is(1));
final SqlSelection sqlSelection = selectClause.getSqlSelections().get(0);
assertThat(sqlSelection.getJdbcResultSetIndex(), is(1));
assertThat(sqlSelection.getValuesArrayPosition(), is(0));
assertThat(sqlSelection.getJdbcValueExtractor(), notNullValue());
assertThat(sqlSelection, instanceOf(SqlSelectionImpl.class));
final Expression selectedExpression = sqlSelection.getExpression();
assertThat(selectedExpression, instanceOf(ColumnReference.class));
final ColumnReference columnReference = (ColumnReference) selectedExpression;
assertThat(columnReference.renderSqlFragment(scope.getSessionFactory()), is("s1_0.gender"));
final JdbcMappingContainer selectedExpressible = selectedExpression.getExpressionType();
assertThat(selectedExpressible, instanceOf(BasicTypeImpl.class));
final BasicTypeImpl<?> basicType = (BasicTypeImpl<?>) selectedExpressible;
assertThat(basicType.getJavaTypeDescriptor().getJavaTypeClass(), AssignableMatcher.assignableTo(Integer.class));
assertThat(basicType.getJdbcType(), is(jdbcTypeRegistry.getDescriptor(Types.TINYINT)));
assertThat(sqlAst.getDomainResultDescriptors().size(), is(1));
final DomainResult<?> domainResult = sqlAst.getDomainResultDescriptors().get(0);
assertThat(domainResult, instanceOf(BasicResult.class));
final BasicResult<?> scalarDomainResult = (BasicResult<?>) domainResult;
assertThat(scalarDomainResult.getAssembler(), instanceOf(BasicResultAssembler.class));
final BasicResultAssembler<?> assembler = (BasicResultAssembler<?>) scalarDomainResult.getAssembler();
assertThat(assembler.getValueConverter(), notNullValue());
assertThat(assembler.getValueConverter(), instanceOf(OrdinalEnumValueConverter.class));
final NavigablePath expectedSelectedPath = new NavigablePath(SimpleEntity.class.getName(), "e").append("gender");
assertThat(domainResult.getNavigablePath(), equalTo(expectedSelectedPath));
assertThat(domainResult, instanceOf(BasicResult.class));
// ScalarDomainResultImpl creates and caches the assembler at its creation.
// this just gets access to that cached one
final DomainResultAssembler<?> resultAssembler = domainResult.createResultAssembler(null, null);
assertThat(resultAssembler, instanceOf(BasicResultAssembler.class));
final BasicValueConverter<?, ?> valueConverter = ((BasicResultAssembler<?>) resultAssembler).getValueConverter();
assertThat(valueConverter, notNullValue());
assertThat(valueConverter, instanceOf(OrdinalEnumValueConverter.class));
final JdbcSelect jdbcSelectOperation = new StandardSqlAstTranslator<JdbcSelect>(session.getSessionFactory(), sqlAst).translate(null, QueryOptions.NONE);
assertThat(jdbcSelectOperation.getSql(), is("select s1_0.gender from mapping_simple_entity s1_0"));
});
}
use of org.hibernate.sql.ast.tree.expression.Expression in project hibernate-orm by hibernate.
the class OracleSpatialSQLMMFunction method render.
@Override
public void render(SqlAppender sqlAppender, List<? extends SqlAstNode> arguments, SqlAstTranslator<?> walker) {
final Expression geometry = (Expression) arguments.get(0);
sqlAppender.appendSql("ST_GEOMETRY(");
walker.render(geometry, SqlAstNodeRenderingMode.DEFAULT);
sqlAppender.appendSql(").");
sqlAppender.appendSql(stMethod);
sqlAppender.appendSql("(");
for (int i = 1; i < arguments.size(); i++) {
Expression param = (Expression) arguments.get(i);
if (param.getExpressionType().getJdbcMappings().get(0).getJdbcType().getDefaultSqlTypeCode() == SqlTypes.GEOMETRY) {
sqlAppender.appendSql("ST_GEOMETRY(");
walker.render(param, SqlAstNodeRenderingMode.DEFAULT);
sqlAppender.appendSql(")");
} else {
walker.render(param, SqlAstNodeRenderingMode.DEFAULT);
}
}
sqlAppender.appendSql(")");
if (addGeomAccessor) {
sqlAppender.appendSql(".geom ");
}
}
use of org.hibernate.sql.ast.tree.expression.Expression in project hibernate-orm by hibernate.
the class STRelateFunction method render.
@Override
public void render(SqlAppender sqlAppender, List<? extends SqlAstNode> arguments, SqlAstTranslator<?> walker) {
final Expression geom1 = (Expression) arguments.get(0);
final Expression geom2 = (Expression) arguments.get(1);
sqlAppender.appendSql("ST_GEOMETRY(");
walker.render(geom1, SqlAstNodeRenderingMode.DEFAULT);
sqlAppender.appendSql(").ST_RELATE( ST_GEOMETRY(");
walker.render(geom2, SqlAstNodeRenderingMode.DEFAULT);
sqlAppender.appendSql(") , 'DETERMINE' ) ");
}
use of org.hibernate.sql.ast.tree.expression.Expression in project hibernate-orm by hibernate.
the class SDORelateFunction method render.
@Override
public void render(SqlAppender sqlAppender, List<? extends SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) {
Expression geom1 = (Expression) sqlAstArguments.get(0);
Expression geom2 = (Expression) sqlAstArguments.get(1);
String maskExpression = String.join("+", masks);
sqlAppender.appendSql("CASE ");
sqlAppender.appendSql(getName());
sqlAppender.appendSql("(");
walker.render(geom1, SqlAstNodeRenderingMode.DEFAULT);
sqlAppender.appendSql(", '");
sqlAppender.appendSql(maskExpression);
sqlAppender.appendSql("', ");
walker.render(geom2, SqlAstNodeRenderingMode.DEFAULT);
sqlAppender.appendSql(")");
sqlAppender.appendSql(" WHEN 'FALSE' THEN 0 ");
sqlAppender.appendSql(" ELSE 1 ");
sqlAppender.appendSql(" END");
}
Aggregations