|
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