diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DB2zLegacyDialect.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DB2zLegacyDialect.java index 3ce2acb8cb71..260db97a5cad 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DB2zLegacyDialect.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DB2zLegacyDialect.java @@ -251,4 +251,10 @@ public int rowIdSqlType() { public String getRowIdColumnString(String rowId) { return rowId( rowId ) + " rowid not null generated always"; } + + @Override + public boolean supportsValuesList() { + // DB2 z/OS has a VALUES statement, but that doesn't support multiple values + return false; + } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/DB2zDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/DB2zDialect.java index f4f6a9fffb4a..8c18859cbe07 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/DB2zDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/DB2zDialect.java @@ -211,4 +211,10 @@ public int rowIdSqlType() { public String getRowIdColumnString(String rowId) { return rowId( rowId ) + " rowid not null generated always"; } + + @Override + public boolean supportsValuesList() { + // DB2 z/OS has a VALUES statement, but that doesn't support multiple values + return false; + } } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java index 90c0f9012684..c12d8967f235 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java @@ -7628,12 +7628,21 @@ public void visitInListPredicate(InListPredicate inListPredicate) { else if ( !dialect.supportsRowValueConstructorSyntaxInInList() ) { // Some DBs like Oracle support tuples only for the IN subquery predicate if ( dialect.supportsRowValueConstructorSyntaxInInSubQuery() && dialect.supportsValuesList() ) { + final int tupleSize = lhsTuple.getExpressionType().getJdbcTypeCount(); inListPredicate.getTestExpression().accept( this ); if ( inListPredicate.isNegated() ) { appendSql( " not" ); } - appendSql( " in (select * from (values" ); + appendSql( " in (select" ); char separator = ' '; + for ( int i = 0; i < tupleSize; i++ ) { + appendSql( separator ); + appendSql( "v_.c" ); + appendSql( i ); + separator = ','; + } + appendSql( " from (values" ); + separator = ' '; for ( Expression expression : listExpressions ) { appendSql( separator ); appendSql( OPEN_PARENTHESIS ); @@ -7642,6 +7651,15 @@ else if ( !dialect.supportsRowValueConstructorSyntaxInInList() ) { separator = ','; } appendSql( CLOSE_PARENTHESIS ); + appendSql( " v_" ); + separator = '('; + for ( int i = 0; i < tupleSize; i++ ) { + appendSql( separator ); + appendSql( "c" ); + appendSql( i ); + separator = ','; + } + appendSql( CLOSE_PARENTHESIS ); appendSql( CLOSE_PARENTHESIS ); } else if ( dialect.supportsRowValueConstructorSyntaxInInSubQuery() && dialect.supportsUnionAll() ) {