From 3d6cd2e55b467fa6890ea3cdd586d98b36a7019d Mon Sep 17 00:00:00 2001 From: Jan Schatteman Date: Fri, 4 Jul 2025 20:34:07 +0200 Subject: [PATCH 1/2] HHH-19595 - Implement support for upserts in HSQLDB Signed-off-by: Jan Schatteman --- .../main/java/org/hibernate/dialect/HSQLDialect.java | 12 ++++++++++++ .../dialect/sql/ast/HSQLSqlAstTranslator.java | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/HSQLDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/HSQLDialect.java index 10d7962911d0..7f3fca95bcdb 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/HSQLDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/HSQLDialect.java @@ -35,6 +35,7 @@ import org.hibernate.exception.spi.ViolatedConstraintNameExtractor; import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.spi.RuntimeModelCreationContext; +import org.hibernate.persister.entity.mutation.EntityMutationTarget; import org.hibernate.query.sqm.CastType; import org.hibernate.query.sqm.IntervalType; import org.hibernate.query.common.TemporalUnit; @@ -51,6 +52,8 @@ import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory; import org.hibernate.sql.ast.tree.Statement; import org.hibernate.sql.exec.spi.JdbcOperation; +import org.hibernate.sql.model.MutationOperation; +import org.hibernate.sql.model.internal.OptionalTableUpdate; import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorHSQLDBDatabaseImpl; import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor; import org.hibernate.type.spi.TypeConfiguration; @@ -782,4 +785,13 @@ public boolean supportsRowValueConstructorSyntaxInInList() { return false; } + @Override + public MutationOperation createOptionalTableUpdateOperation( + EntityMutationTarget mutationTarget, + OptionalTableUpdate optionalTableUpdate, + SessionFactoryImplementor factory) { + return new HSQLSqlAstTranslator<>( factory, optionalTableUpdate ) + .createMergeOperation( optionalTableUpdate ); + } + } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/sql/ast/HSQLSqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/dialect/sql/ast/HSQLSqlAstTranslator.java index 4b7112c8c386..c220e1fb412e 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/sql/ast/HSQLSqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/sql/ast/HSQLSqlAstTranslator.java @@ -13,7 +13,7 @@ import org.hibernate.query.sqm.ComparisonOperator; import org.hibernate.sql.ast.Clause; import org.hibernate.sql.ast.SqlAstNodeRenderingMode; -import org.hibernate.sql.ast.spi.AbstractSqlAstTranslator; +import org.hibernate.sql.ast.spi.SqlAstTranslatorWithMerge; import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.ast.tree.Statement; import org.hibernate.sql.ast.tree.expression.CaseSearchedExpression; @@ -40,7 +40,7 @@ * * @author Christian Beikov */ -public class HSQLSqlAstTranslator extends AbstractSqlAstTranslator { +public class HSQLSqlAstTranslator extends SqlAstTranslatorWithMerge { public HSQLSqlAstTranslator(SessionFactoryImplementor sessionFactory, Statement statement) { super( sessionFactory, statement ); From 2b265bbad80cb211d4b29091e6d0894c6bb83d46 Mon Sep 17 00:00:00 2001 From: Jan Schatteman Date: Fri, 4 Jul 2025 22:42:38 +0200 Subject: [PATCH 2/2] HHH-19595 - Enable support for upserts in EDB (v > 15) Signed-off-by: Jan Schatteman --- .../org/hibernate/dialect/PostgresPlusDialect.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/PostgresPlusDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/PostgresPlusDialect.java index 79f474371a21..fe925b3a2777 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/PostgresPlusDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/PostgresPlusDialect.java @@ -13,7 +13,6 @@ import org.hibernate.dialect.sql.ast.PostgreSQLSqlAstTranslator; import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo; import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.persister.entity.mutation.EntityMutationTarget; import org.hibernate.query.sqm.CastType; import org.hibernate.query.common.TemporalUnit; import org.hibernate.query.sqm.produce.function.StandardFunctionArgumentTypeResolvers; @@ -23,9 +22,6 @@ import org.hibernate.sql.ast.tree.Statement; import org.hibernate.sql.ast.tree.expression.BinaryArithmeticExpression; import org.hibernate.sql.exec.spi.JdbcOperation; -import org.hibernate.sql.model.MutationOperation; -import org.hibernate.sql.model.internal.OptionalTableUpdate; -import org.hibernate.sql.model.jdbc.OptionalTableUpdateOperation; import jakarta.persistence.TemporalType; @@ -136,16 +132,6 @@ public String getSelectGUIDString() { return "select uuid_generate_v1"; } - @Override - public MutationOperation createOptionalTableUpdateOperation( - EntityMutationTarget mutationTarget, - OptionalTableUpdate optionalTableUpdate, - SessionFactoryImplementor factory) { - // Postgres Plus does not support full merge semantics - - // https://www.enterprisedb.com/docs/migrating/oracle/oracle_epas_comparison/notable_differences/ - return new OptionalTableUpdateOperation( mutationTarget, optionalTableUpdate, factory ); - } - @Override public SqlAstTranslatorFactory getSqlAstTranslatorFactory() { return new StandardSqlAstTranslatorFactory() {