|
9 | 9 | import org.hibernate.engine.spi.SessionFactoryImplementor;
|
10 | 10 | import org.hibernate.query.IllegalQueryOperationException;
|
11 | 11 | import org.hibernate.query.sqm.ComparisonOperator;
|
| 12 | +import org.hibernate.query.sqm.sql.internal.SqmParameterInterpretation; |
12 | 13 | import org.hibernate.sql.ast.Clause;
|
13 | 14 | import org.hibernate.sql.ast.spi.SqlAstTranslatorWithMerge;
|
14 | 15 | import org.hibernate.sql.ast.spi.SqlSelection;
|
|
18 | 19 | import org.hibernate.sql.ast.tree.expression.Expression;
|
19 | 20 | import org.hibernate.sql.ast.tree.expression.FunctionExpression;
|
20 | 21 | import org.hibernate.sql.ast.tree.expression.Literal;
|
| 22 | +import org.hibernate.sql.ast.tree.expression.SelfRenderingExpression; |
21 | 23 | import org.hibernate.sql.ast.tree.expression.SqlTuple;
|
22 | 24 | import org.hibernate.sql.ast.tree.expression.Summarization;
|
23 | 25 | import org.hibernate.sql.ast.tree.from.ValuesTableReference;
|
@@ -244,6 +246,23 @@ public void visitQuerySpec(QuerySpec querySpec) {
|
244 | 246 | }
|
245 | 247 | }
|
246 | 248 |
|
| 249 | + @Override |
| 250 | + public void visitSelfRenderingExpression(SelfRenderingExpression expression) { |
| 251 | + final boolean isStringFunctionWithParameterArg = |
| 252 | + expression instanceof FunctionExpression fn |
| 253 | + && expression.getExpressionType() != null |
| 254 | + && expression.getExpressionType().getJdbcTypeCount() == 1 |
| 255 | + && expression.getExpressionType().getSingleJdbcMapping().getJdbcType().isString() |
| 256 | + && fn.getArguments().stream().anyMatch( arg -> arg instanceof SqmParameterInterpretation ); |
| 257 | + if ( isStringFunctionWithParameterArg ) { |
| 258 | + append( "cast(" ); |
| 259 | + } |
| 260 | + super.visitSelfRenderingExpression( expression ); |
| 261 | + if ( isStringFunctionWithParameterArg ) { |
| 262 | + append( " as lvarchar)" ); |
| 263 | + } |
| 264 | + } |
| 265 | + |
247 | 266 | private void caseArgument(Expression expression) {
|
248 | 267 | // concatenation inside a case must be cast to varchar(255)
|
249 | 268 | // or we get a bunch of trailing whitespace
|
|
0 commit comments