@@ -3623,13 +3623,8 @@ else if ( !dialect.supportsDuplicateSelectItemsInQueryGroup() ) {
36233623 if ( queryGroupAlias != null ) {
36243624 appendSql ( OPEN_PARENTHESIS );
36253625 }
3626- visitSelectClause ( querySpec .getSelectClause () );
3627- visitFromClause ( querySpec .getFromClause () );
3628- visitWhereClause ( querySpec .getWhereClauseRestrictions () );
3629- visitGroupByClause ( querySpec , dialect .getGroupBySelectItemReferenceStrategy () );
3630- visitHavingClause ( querySpec );
3631- visitOrderBy ( querySpec .getSortSpecifications () );
3632- visitOffsetFetchClause ( querySpec );
3626+
3627+ visitQueryClauses ( querySpec );
36333628 // We render the FOR UPDATE clause in the parent query
36343629 if ( queryPartForRowNumbering == null ) {
36353630 visitForUpdateClause ( querySpec );
@@ -3652,6 +3647,16 @@ else if ( !dialect.supportsDuplicateSelectItemsInQueryGroup() ) {
36523647 }
36533648 }
36543649
3650+ protected void visitQueryClauses (QuerySpec querySpec ) {
3651+ visitSelectClause ( querySpec .getSelectClause () );
3652+ visitFromClause ( querySpec .getFromClause () );
3653+ visitWhereClause ( querySpec .getWhereClauseRestrictions () );
3654+ visitGroupByClause ( querySpec , dialect .getGroupBySelectItemReferenceStrategy () );
3655+ visitHavingClause ( querySpec );
3656+ visitOrderBy ( querySpec .getSortSpecifications () );
3657+ visitOffsetFetchClause ( querySpec );
3658+ }
3659+
36553660 private boolean hasDuplicateSelectItems (QuerySpec querySpec ) {
36563661 final List <SqlSelection > sqlSelections = querySpec .getSelectClause ().getSqlSelections ();
36573662 final Map <Expression , Boolean > map = new IdentityHashMap <>( sqlSelections .size () );
@@ -3664,9 +3669,8 @@ private boolean hasDuplicateSelectItems(QuerySpec querySpec) {
36643669 }
36653670
36663671 protected final void visitWhereClause (Predicate whereClauseRestrictions ) {
3667- final Predicate additionalWherePredicate = this .additionalWherePredicate ;
3668- if ( whereClauseRestrictions != null && !whereClauseRestrictions .isEmpty ()
3669- || additionalWherePredicate != null ) {
3672+ if ( hasWhere ( whereClauseRestrictions ) ) {
3673+ final Predicate additionalWherePredicate = this .additionalWherePredicate ;
36703674 appendSql ( " where " );
36713675
36723676 clauseStack .push ( Clause .WHERE );
@@ -3690,6 +3694,11 @@ else if ( additionalWherePredicate != null ) {
36903694 }
36913695 }
36923696
3697+ protected boolean hasWhere (Predicate whereClauseRestrictions ) {
3698+ return whereClauseRestrictions != null && !whereClauseRestrictions .isEmpty ()
3699+ || additionalWherePredicate != null ;
3700+ }
3701+
36933702 protected Expression resolveAliasedExpression (Expression expression ) {
36943703 // This can happen when using window functions for emulating the offset/fetch clause of a query group
36953704 // But in that case we always use a SqlSelectionExpression anyway, so this is fine as it doesn't need resolving
@@ -5682,8 +5691,9 @@ protected void renderLiteral(Literal literal, boolean castParameter) {
56825691 // If we encounter a plain literal in the select clause which has no literal formatter, we must render it as parameter
56835692 if ( literalFormatter == null ) {
56845693 parameterBinders .add ( literal );
5685- final String marker = parameterMarkerStrategy .createMarker ( parameterBinders .size (), literal .getJdbcMapping ().getJdbcType () );
5686- final LiteralAsParameter <Object > jdbcParameter = new LiteralAsParameter <>( literal , marker );
5694+ final JdbcType jdbcType = literal .getJdbcMapping ().getJdbcType ();
5695+ final String marker = parameterMarkerStrategy .createMarker ( parameterBinders .size (), jdbcType );
5696+ final LiteralAsParameter <?> jdbcParameter = new LiteralAsParameter <>( literal , marker );
56875697 if ( castParameter ) {
56885698 renderCasted ( jdbcParameter );
56895699 }
@@ -5707,13 +5717,17 @@ protected void renderLiteral(Literal literal, boolean castParameter) {
57075717
57085718 @ Override
57095719 public void visitFromClause (FromClause fromClause ) {
5710- if ( fromClause == null || fromClause .getRoots ().isEmpty () ) {
5711- appendSql ( getFromDualForSelectOnly () );
5712- }
5713- else {
5720+ if ( hasFrom ( fromClause ) ) {
57145721 appendSql ( " from " );
57155722 renderFromClauseSpaces ( fromClause );
57165723 }
5724+ else {
5725+ appendSql ( getFromDualForSelectOnly () );
5726+ }
5727+ }
5728+
5729+ protected boolean hasFrom (FromClause fromClause ) {
5730+ return fromClause != null && !fromClause .getRoots ().isEmpty ();
57175731 }
57185732
57195733 protected void renderFromClauseSpaces (FromClause fromClause ) {
0 commit comments