From c1e7fe7ffb9647e9dbaa7a2acf14ed5207cc41e2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 5 Sep 2023 13:39:55 +0200 Subject: [PATCH 01/24] fix(deps): update dependency io.micronaut.validation:micronaut-validation-bom to v4.0.2 (#2489) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2b068a4080f..fed0838af98 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ micronaut-test = "4.0.0" micronaut-mongo = "5.0.1" micronaut-kotlin = "4.0.1" micronaut-multitenancy = "5.0.2" -micronaut-validation = "4.0.1" +micronaut-validation = "4.0.2" micronaut-logging = "1.1.0" micronaut-flyway = "6.0.2" From 9c347f25d149c8b19156047ca863fc786b555c3b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 5 Sep 2023 14:45:27 +0200 Subject: [PATCH 02/24] fix(deps): update dependency io.micronaut:micronaut-core-bom to v4.1.3 (#2487) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fed0838af98..c1c509b62f7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -micronaut = "4.1.2" +micronaut = "4.1.3" micronaut-platform = "4.0.3" micronaut-docs = "2.0.0" micronaut-gradle-plugin = "4.0.3" From 2a1c51742e498231582aa3fd5ea56b1e9422506f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 5 Sep 2023 14:45:39 +0200 Subject: [PATCH 03/24] fix(deps): update dependency io.micronaut.spring:micronaut-spring-bom to v5.0.2 (#2486) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c1c509b62f7..de19358a802 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,7 @@ micronaut-rxjava2 = "2.0.1" micronaut-r2dbc = "5.0.1" micronaut-serde = "2.2.4" micronaut-sql = "5.0.1" -micronaut-spring = "5.0.1" +micronaut-spring = "5.0.2" micronaut-test = "4.0.0" micronaut-mongo = "5.0.1" micronaut-kotlin = "4.0.1" From 64acd03f36f5e98967fe26acbb692cbb0714e348 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 7 Sep 2023 09:26:28 +0200 Subject: [PATCH 04/24] chore(deps): update graalvm/setup-graalvm action to v1.1.3 (#2493) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/gradle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 6860682c240..1d7e9714e3d 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -45,7 +45,7 @@ jobs: fetch-depth: 0 - name: "🔧 Setup GraalVM CE" - uses: graalvm/setup-graalvm@v1.1.2 + uses: graalvm/setup-graalvm@v1.1.3 with: distribution: 'graalvm-community' java-version: ${{ matrix.java }} From 6e9e86a6d0d054c67897d8d83408aa243b5cd4f2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 8 Sep 2023 20:42:25 +0200 Subject: [PATCH 05/24] chore(deps): update dependency gradle to v8.3 (#2481) * chore(deps): update dependency gradle to v8.3 * Use gradle plugin 4.1.0 --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: radovanradic --- gradle/libs.versions.toml | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index de19358a802..abf00954e70 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ micronaut = "4.1.3" micronaut-platform = "4.0.3" micronaut-docs = "2.0.0" -micronaut-gradle-plugin = "4.0.3" +micronaut-gradle-plugin = "4.1.0" micronaut-testresources = "2.0.0" micronaut-azure = "5.0.1" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9f4197d5f4b..ac72c34e8ac 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 6db84e382be5a3b6b0f480d0afcfb67061407bc6 Mon Sep 17 00:00:00 2001 From: micronaut-build <65172877+micronaut-build@users.noreply.github.com> Date: Mon, 11 Sep 2023 08:18:25 +0200 Subject: [PATCH 06/24] Update common files (#2499) --- .github/workflows/gradle.yml | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 1d7e9714e3d..6860682c240 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -45,7 +45,7 @@ jobs: fetch-depth: 0 - name: "🔧 Setup GraalVM CE" - uses: graalvm/setup-graalvm@v1.1.3 + uses: graalvm/setup-graalvm@v1.1.2 with: distribution: 'graalvm-community' java-version: ${{ matrix.java }} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ac72c34e8ac..9f4197d5f4b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 6b60fd56fb182b614c4b813291d66846f7bd6692 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 16:10:40 +0200 Subject: [PATCH 07/24] fix(deps): update dependency io.micronaut.multitenancy:micronaut-multitenancy-bom to v5.0.3 (#2504) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index abf00954e70..0658336958a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,7 +15,7 @@ micronaut-spring = "5.0.2" micronaut-test = "4.0.0" micronaut-mongo = "5.0.1" micronaut-kotlin = "4.0.1" -micronaut-multitenancy = "5.0.2" +micronaut-multitenancy = "5.0.3" micronaut-validation = "4.0.2" micronaut-logging = "1.1.0" micronaut-flyway = "6.0.2" From 483795a7cd64f6af4ab9c8829407b1e2f517d651 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 20:50:19 +0200 Subject: [PATCH 08/24] fix(deps): update dependency io.micronaut.validation:micronaut-validation-bom to v4.0.3 (#2505) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0658336958a..f998b78bb34 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ micronaut-test = "4.0.0" micronaut-mongo = "5.0.1" micronaut-kotlin = "4.0.1" micronaut-multitenancy = "5.0.3" -micronaut-validation = "4.0.2" +micronaut-validation = "4.0.3" micronaut-logging = "1.1.0" micronaut-flyway = "6.0.2" From fd84f66d50120f1d539ef7b4d7e0014d4ae46ec6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 22:26:56 +0200 Subject: [PATCH 09/24] fix(deps): update dependency io.micronaut:micronaut-core-bom to v4.1.4 (#2508) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f998b78bb34..7830673ccc8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -micronaut = "4.1.3" +micronaut = "4.1.4" micronaut-platform = "4.0.3" micronaut-docs = "2.0.0" micronaut-gradle-plugin = "4.1.0" From 041af7d58b4758019697d5a6c714f6776948f2e4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 22:27:07 +0200 Subject: [PATCH 10/24] fix(deps): update dependency io.micronaut.logging:micronaut-logging-bom to v1.1.2 (#2507) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7830673ccc8..59f0d76a635 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,7 +17,7 @@ micronaut-mongo = "5.0.1" micronaut-kotlin = "4.0.1" micronaut-multitenancy = "5.0.3" micronaut-validation = "4.0.3" -micronaut-logging = "1.1.0" +micronaut-logging = "1.1.2" micronaut-flyway = "6.0.2" groovy = "4.0.14" From b4c41dd5ad9f18ec34d958d88c43c70093229173 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 22:27:21 +0200 Subject: [PATCH 11/24] fix(deps): update dependency io.micronaut.kotlin:micronaut-kotlin-bom to v4.0.2 (#2506) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 59f0d76a635..60c9c379ddf 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ micronaut-sql = "5.0.1" micronaut-spring = "5.0.2" micronaut-test = "4.0.0" micronaut-mongo = "5.0.1" -micronaut-kotlin = "4.0.1" +micronaut-kotlin = "4.0.2" micronaut-multitenancy = "5.0.3" micronaut-validation = "4.0.3" micronaut-logging = "1.1.2" From 03df22b120295bc126b26301c87f4ec3604a72be Mon Sep 17 00:00:00 2001 From: micronaut-build <65172877+micronaut-build@users.noreply.github.com> Date: Wed, 13 Sep 2023 08:30:34 +0200 Subject: [PATCH 12/24] Update common files (#2511) --- .github/workflows/central-sync.yml | 2 +- .github/workflows/graalvm-dev.yml | 4 ++-- .github/workflows/graalvm-latest.yml | 4 ++-- .github/workflows/gradle.yml | 6 +++--- .github/workflows/publish-snapshot.yml | 2 +- .github/workflows/release.yml | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/central-sync.yml b/.github/workflows/central-sync.yml index ea5a5aa5bf9..713f87894f6 100644 --- a/.github/workflows/central-sync.yml +++ b/.github/workflows/central-sync.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: v${{ github.event.inputs.release_version }} - uses: gradle/wrapper-validation-action@v1 diff --git a/.github/workflows/graalvm-dev.yml b/.github/workflows/graalvm-dev.yml index 9c7a33e11df..ecd870d6ef5 100644 --- a/.github/workflows/graalvm-dev.yml +++ b/.github/workflows/graalvm-dev.yml @@ -18,7 +18,7 @@ jobs: outputs: matrix: ${{ steps.build-matrix.outputs.matrix }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build Matrix uses: micronaut-projects/github-actions/graalvm/build-matrix@master id: build-matrix @@ -34,7 +34,7 @@ jobs: GRADLE_ENTERPRISE_CACHE_USERNAME: ${{ secrets.GRADLE_ENTERPRISE_CACHE_USERNAME }} GRADLE_ENTERPRISE_CACHE_PASSWORD: ${{ secrets.GRADLE_ENTERPRISE_CACHE_PASSWORD }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Pre-Build Steps uses: micronaut-projects/github-actions/graalvm/pre-build@master id: pre-build diff --git a/.github/workflows/graalvm-latest.yml b/.github/workflows/graalvm-latest.yml index b795fe408d3..97fff451e2e 100644 --- a/.github/workflows/graalvm-latest.yml +++ b/.github/workflows/graalvm-latest.yml @@ -24,7 +24,7 @@ jobs: outputs: matrix: ${{ steps.build-matrix.outputs.matrix }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build Matrix uses: micronaut-projects/github-actions/graalvm/build-matrix@master id: build-matrix @@ -40,7 +40,7 @@ jobs: GRADLE_ENTERPRISE_CACHE_USERNAME: ${{ secrets.GRADLE_ENTERPRISE_CACHE_USERNAME }} GRADLE_ENTERPRISE_CACHE_PASSWORD: ${{ secrets.GRADLE_ENTERPRISE_CACHE_PASSWORD }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Pre-Build Steps uses: micronaut-projects/github-actions/graalvm/pre-build@master id: pre-build diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 6860682c240..64c6bbcbf19 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -40,12 +40,12 @@ jobs: df -h - name: "📥 Checkout repository" - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: "🔧 Setup GraalVM CE" - uses: graalvm/setup-graalvm@v1.1.2 + uses: graalvm/setup-graalvm@v1.1.3 with: distribution: 'graalvm-community' java-version: ${{ matrix.java }} @@ -70,7 +70,7 @@ jobs: - name: "📊 Publish Test Report" if: always() - uses: mikepenz/action-junit-report@v3 + uses: mikepenz/action-junit-report@v4 with: check_name: Java CI / Test Report (${{ matrix.java }}) report_paths: '**/build/test-results/test/TEST-*.xml' diff --git a/.github/workflows/publish-snapshot.yml b/.github/workflows/publish-snapshot.yml index 5dec33e126b..cbf48711350 100644 --- a/.github/workflows/publish-snapshot.yml +++ b/.github/workflows/publish-snapshot.yml @@ -10,7 +10,7 @@ jobs: if: github.repository != 'micronaut-projects/micronaut-project-template' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/cache@v3 with: path: ~/.gradle/caches diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4158245eb08..3ba43c4e996 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: token: ${{ secrets.GH_TOKEN }} - uses: gradle/wrapper-validation-action@v1 @@ -146,7 +146,7 @@ jobs: if: startsWith(github.ref, 'refs/tags/') steps: - name: Checkout repository - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 - name: Download artifacts uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 with: diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9f4197d5f4b..ac72c34e8ac 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From e041f466326e896f3fbc30afde221ff13b50dee6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 13 Sep 2023 09:45:32 +0200 Subject: [PATCH 13/24] fix(deps): update dependency io.micronaut:micronaut-core-bom to v4.1.5 (#2512) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 60c9c379ddf..028dcb803e0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -micronaut = "4.1.4" +micronaut = "4.1.5" micronaut-platform = "4.0.3" micronaut-docs = "2.0.0" micronaut-gradle-plugin = "4.1.0" From d15252f5a3cbb87b74157cd520e1ee2cfac05336 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Sep 2023 08:47:37 +0200 Subject: [PATCH 14/24] fix(deps): update dependency org.apache.groovy:groovy-dateutil to v4.0.15 (#2514) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 028dcb803e0..dc524f5e691 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -20,7 +20,7 @@ micronaut-validation = "4.0.3" micronaut-logging = "1.1.2" micronaut-flyway = "6.0.2" -groovy = "4.0.14" +groovy = "4.0.15" managed-javax-persistence = "2.2" managed-jakarta-persistence-api = "3.1.0" From 6de567fbb190cdc56433c65480fb589b95b33443 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Sep 2023 17:05:36 +0200 Subject: [PATCH 15/24] fix(deps): update spring data (#2517) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dc524f5e691..0005389abb4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -26,7 +26,7 @@ managed-javax-persistence = "2.2" managed-jakarta-persistence-api = "3.1.0" managed-jakarta-transaction-api = "2.0.1" -spring-data = "3.1.3" +spring-data = "3.1.4" # JDBC Drivers @@ -35,7 +35,7 @@ oracle-jdbc-driver = "23.2.0.0" # Testing and benchmarking -benchmark-spring-data = "2023.0.3" +benchmark-spring-data = "2023.0.4" spock = "2.2-groovy-4.0" testcontainers = "1.19.0" jmh = "1.37" From 3577af801dd46af6aadee41360588f4eef678128 Mon Sep 17 00:00:00 2001 From: Sergio del Amo Date: Mon, 18 Sep 2023 17:47:47 +0200 Subject: [PATCH 16/24] bug: JPA if native use createNativeMutationQuery (#2520) * bug: JPA if native use createNativeMutationQuery * use test resources --- data-hibernate-jpa/build.gradle | 3 ++ .../operations/HibernateJpaOperations.java | 2 +- .../hibernate/nativepostgresql/Product.java | 52 ++++++++++++++++++ .../nativepostgresql/ProductRepository.java | 21 ++++++++ .../ProductRepositoryTest.java | 54 +++++++++++++++++++ .../hibernate/nativepostgresql/SqlUtils.java | 31 +++++++++++ .../src/test/resources/sql/seed-data.sql | 2 + 7 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/nativepostgresql/Product.java create mode 100644 data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/nativepostgresql/ProductRepository.java create mode 100644 data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/nativepostgresql/ProductRepositoryTest.java create mode 100644 data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/nativepostgresql/SqlUtils.java create mode 100644 data-hibernate-jpa/src/test/resources/sql/seed-data.sql diff --git a/data-hibernate-jpa/build.gradle b/data-hibernate-jpa/build.gradle index 96371719fa5..1f57d80f311 100644 --- a/data-hibernate-jpa/build.gradle +++ b/data-hibernate-jpa/build.gradle @@ -37,6 +37,9 @@ dependencies { testRuntimeOnly mnSql.h2 testRuntimeOnly mnSql.postgresql testRuntimeOnly mnSql.micronaut.jdbc.tomcat + + testRuntimeOnly(libs.jupiter.engine) + testImplementation(mnTest.micronaut.test.junit5) } micronaut { diff --git a/data-hibernate-jpa/src/main/java/io/micronaut/data/hibernate/operations/HibernateJpaOperations.java b/data-hibernate-jpa/src/main/java/io/micronaut/data/hibernate/operations/HibernateJpaOperations.java index d50c6a523b4..9b859b34928 100644 --- a/data-hibernate-jpa/src/main/java/io/micronaut/data/hibernate/operations/HibernateJpaOperations.java +++ b/data-hibernate-jpa/src/main/java/io/micronaut/data/hibernate/operations/HibernateJpaOperations.java @@ -382,7 +382,7 @@ private boolean flushIfNecessary(EntityManager entityManager, AnnotationMetadata public Optional executeUpdate(@NonNull PreparedQuery preparedQuery) { return executeWrite(session -> { String query = preparedQuery.getQuery(); - MutationQuery q = session.createMutationQuery(query); + MutationQuery q = preparedQuery.isNative() ? session.createNativeMutationQuery(query) : session.createMutationQuery(query); bindParameters(q, preparedQuery); int numAffected = q.executeUpdate(); flushIfNecessary(session, preparedQuery.getAnnotationMetadata(), true); diff --git a/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/nativepostgresql/Product.java b/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/nativepostgresql/Product.java new file mode 100644 index 00000000000..30556e21858 --- /dev/null +++ b/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/nativepostgresql/Product.java @@ -0,0 +1,52 @@ +package io.micronaut.data.hibernate.nativepostgresql; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +@Entity +@Table(name = "products") +public class Product { + + @Id + private Long id; + + @Column(nullable = false, unique = true) + private String code; + + @Column(nullable = false) + private String name; + + public Product() {} + + public Product(Long id, String code, String name) { + this.id = id; + this.code = code; + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/nativepostgresql/ProductRepository.java b/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/nativepostgresql/ProductRepository.java new file mode 100644 index 00000000000..037371807d1 --- /dev/null +++ b/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/nativepostgresql/ProductRepository.java @@ -0,0 +1,21 @@ +package io.micronaut.data.hibernate.nativepostgresql; + +import io.micronaut.context.annotation.Property; +import io.micronaut.context.annotation.Requires; +import io.micronaut.data.annotation.Query; +import io.micronaut.data.annotation.Repository; +import io.micronaut.data.jpa.repository.JpaRepository; + +@Requires(property = "spec.name", value = "nativepostgresql") +@Repository +interface ProductRepository extends JpaRepository { + default void createProductIfNotExists(Product product) { + createProductIfNotExists(product.getId(), product.getCode(), product.getName()); + } + + @Query( + value = "INSERT INTO products(id, code, name) VALUES(:id, :code, :name) ON CONFLICT DO NOTHING", + nativeQuery = true + ) + void createProductIfNotExists(Long id, String code, String name); +} diff --git a/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/nativepostgresql/ProductRepositoryTest.java b/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/nativepostgresql/ProductRepositoryTest.java new file mode 100644 index 00000000000..5586d2d8f93 --- /dev/null +++ b/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/nativepostgresql/ProductRepositoryTest.java @@ -0,0 +1,54 @@ +package io.micronaut.data.hibernate.nativepostgresql; + +import io.micronaut.context.annotation.Property; +import io.micronaut.core.io.ResourceLoader; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; +import jakarta.inject.Inject; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; + +@MicronautTest(startApplication = false) +@Property(name = "spec.name", value = "nativepostgresql") +@Property(name = "jpa.default.properties.hibernate.hbm2ddl.auto", value = "create-drop") +@Property(name = "jpa.default.entity-scan.packages", value = "io.micronaut.data.hibernate.nativepostgresql") +@Property(name = "datasources.default.db-type", value = "postgres") +@Property(name = "datasources.default.dialect", value = "POSTGRES") +@Property(name = "datasources.default.driver-class-name", value = "org.postgresql.Driver") +class ProductRepositoryTest { + @Inject + Connection connection; + + @Inject + ResourceLoader resourceLoader; + + @Inject + ProductRepository productRepository; + + @BeforeEach + void setUp() throws IOException, SQLException { + SqlUtils.load(connection, resourceLoader, "sql/seed-data.sql"); + } + + @Test + void shouldGetAllProducts() { + List products = productRepository.findAll(); + assertEquals(2, products.size()); + } + + @Test + void shouldNotCreateAProductWithDuplicateCode() { + Product product = new Product(3L, "p101", "Test Product"); + assertDoesNotThrow(() -> productRepository.createProductIfNotExists(product)); + Optional optionalProduct = productRepository.findById(product.getId()); + assertTrue(optionalProduct.isEmpty()); + } + +} diff --git a/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/nativepostgresql/SqlUtils.java b/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/nativepostgresql/SqlUtils.java new file mode 100644 index 00000000000..cf72cdce097 --- /dev/null +++ b/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/nativepostgresql/SqlUtils.java @@ -0,0 +1,31 @@ +package io.micronaut.data.hibernate.nativepostgresql; + +import io.micronaut.core.io.ResourceLoader; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Optional; + +public final class SqlUtils { + private SqlUtils() { + } + + public static void load(Connection connection, + ResourceLoader resourceLoader, + String path) throws IOException, SQLException { + Optional resource = resourceLoader.getResource(path); + if (resource.isPresent()) { + try (InputStream in = resource.get().openStream()) { + String sql = new String(in.readAllBytes(), StandardCharsets.UTF_8); + try(Statement statement = connection.createStatement()) { + statement.execute(sql); + } + } + } + } +} diff --git a/data-hibernate-jpa/src/test/resources/sql/seed-data.sql b/data-hibernate-jpa/src/test/resources/sql/seed-data.sql new file mode 100644 index 00000000000..c537b0a68c4 --- /dev/null +++ b/data-hibernate-jpa/src/test/resources/sql/seed-data.sql @@ -0,0 +1,2 @@ +insert into products(id, code, name) values(1, 'p101', 'Apple MacBook Pro') ON CONFLICT DO NOTHING; +insert into products(id, code, name) values(2, 'p102', 'Sony TV') ON CONFLICT DO NOTHING; From 9ec16c9ba997868943cf381d045585e85cdce76b Mon Sep 17 00:00:00 2001 From: Dean Wette Date: Mon, 18 Sep 2023 05:08:49 -0500 Subject: [PATCH 17/24] doc: how to use Spring JdbcTemplate, with multi-language examples. (#2494) close #2423 --- .../build.gradle | 23 +++++++++ .../gradle.properties | 1 + .../example/AbstractBookRepository.groovy | 33 ++++++++++++ .../src/main/groovy/example/Book.groovy | 15 ++++++ .../src/main/resources/application.yml | 8 +++ .../src/main/resources/logback.xml | 12 +++++ .../groovy/example/BookRepositorySpec.groovy | 44 ++++++++++++++++ .../build.gradle | 22 ++++++++ .../gradle.properties | 1 + .../java/example/AbstractBookRepository.java | 36 +++++++++++++ .../src/main/java/example/Book.java | 15 ++++++ .../src/main/resources/application.yml | 8 +++ .../src/main/resources/logback.xml | 12 +++++ .../test/java/example/BookRepositoryTest.java | 50 +++++++++++++++++++ .../build.gradle | 25 ++++++++++ .../gradle.properties | 1 + .../kotlin/example/AbstractBookRepository.kt | 25 ++++++++++ .../src/main/kotlin/example/Book.kt | 14 ++++++ .../src/main/resources/application.yml | 8 +++ .../src/main/resources/logback.xml | 12 +++++ .../test/kotlin/example/BookRepositoryTest.kt | 48 ++++++++++++++++++ settings.gradle | 4 ++ src/main/docs/guide/dbc/dbcRepositories.adoc | 26 +++++++++- 23 files changed, 442 insertions(+), 1 deletion(-) create mode 100644 doc-examples/jdbc-spring-template-example-groovy/build.gradle create mode 100644 doc-examples/jdbc-spring-template-example-groovy/gradle.properties create mode 100644 doc-examples/jdbc-spring-template-example-groovy/src/main/groovy/example/AbstractBookRepository.groovy create mode 100644 doc-examples/jdbc-spring-template-example-groovy/src/main/groovy/example/Book.groovy create mode 100644 doc-examples/jdbc-spring-template-example-groovy/src/main/resources/application.yml create mode 100644 doc-examples/jdbc-spring-template-example-groovy/src/main/resources/logback.xml create mode 100644 doc-examples/jdbc-spring-template-example-groovy/src/test/groovy/example/BookRepositorySpec.groovy create mode 100644 doc-examples/jdbc-spring-template-example-java/build.gradle create mode 100644 doc-examples/jdbc-spring-template-example-java/gradle.properties create mode 100644 doc-examples/jdbc-spring-template-example-java/src/main/java/example/AbstractBookRepository.java create mode 100644 doc-examples/jdbc-spring-template-example-java/src/main/java/example/Book.java create mode 100644 doc-examples/jdbc-spring-template-example-java/src/main/resources/application.yml create mode 100644 doc-examples/jdbc-spring-template-example-java/src/main/resources/logback.xml create mode 100644 doc-examples/jdbc-spring-template-example-java/src/test/java/example/BookRepositoryTest.java create mode 100644 doc-examples/jdbc-spring-template-example-kotlin/build.gradle create mode 100644 doc-examples/jdbc-spring-template-example-kotlin/gradle.properties create mode 100644 doc-examples/jdbc-spring-template-example-kotlin/src/main/kotlin/example/AbstractBookRepository.kt create mode 100644 doc-examples/jdbc-spring-template-example-kotlin/src/main/kotlin/example/Book.kt create mode 100644 doc-examples/jdbc-spring-template-example-kotlin/src/main/resources/application.yml create mode 100644 doc-examples/jdbc-spring-template-example-kotlin/src/main/resources/logback.xml create mode 100644 doc-examples/jdbc-spring-template-example-kotlin/src/test/kotlin/example/BookRepositoryTest.kt diff --git a/doc-examples/jdbc-spring-template-example-groovy/build.gradle b/doc-examples/jdbc-spring-template-example-groovy/build.gradle new file mode 100644 index 00000000000..47d6bf7bbd3 --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-groovy/build.gradle @@ -0,0 +1,23 @@ +plugins { + id "groovy" + id "io.micronaut.build.internal.data-example" +} + +micronaut { + version libs.versions.micronaut.platform.get() + runtime "netty" + testRuntime "spock" +} + +dependencies { + compileOnly projects.micronautDataProcessor + compileOnly mnValidation.micronaut.validation.processor + + implementation projects.micronautDataJdbc + implementation projects.micronautDataSpringJdbc + implementation mnValidation.micronaut.validation + + runtimeOnly mnSql.micronaut.jdbc.tomcat + runtimeOnly mnLogging.logback.classic + runtimeOnly mnSql.h2 +} diff --git a/doc-examples/jdbc-spring-template-example-groovy/gradle.properties b/doc-examples/jdbc-spring-template-example-groovy/gradle.properties new file mode 100644 index 00000000000..2f7c48213f8 --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-groovy/gradle.properties @@ -0,0 +1 @@ +skipDocumentation=true diff --git a/doc-examples/jdbc-spring-template-example-groovy/src/main/groovy/example/AbstractBookRepository.groovy b/doc-examples/jdbc-spring-template-example-groovy/src/main/groovy/example/AbstractBookRepository.groovy new file mode 100644 index 00000000000..fa50422d035 --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-groovy/src/main/groovy/example/AbstractBookRepository.groovy @@ -0,0 +1,33 @@ +package example + +import io.micronaut.context.annotation.Requires +import io.micronaut.core.annotation.NonNull +import io.micronaut.data.connection.jdbc.advice.DelegatingDataSource +import io.micronaut.data.jdbc.annotation.JdbcRepository +import io.micronaut.data.model.query.builder.sql.Dialect +import io.micronaut.data.repository.CrudRepository +import jakarta.transaction.Transactional +import jakarta.validation.Valid +import jakarta.validation.constraints.NotNull +import org.springframework.jdbc.core.JdbcTemplate + +import javax.sql.DataSource + +@Requires(property = 'spec.name', value = 'BookRepositorySpec') +// tag::clazz[] +@JdbcRepository(dialect = Dialect.H2) +abstract class AbstractBookRepository implements CrudRepository<@Valid Book, @NotNull Long> { + + private final JdbcTemplate jdbcTemplate; //<2> + + AbstractBookRepository(DataSource dataSource) { // <1> + this.jdbcTemplate = new JdbcTemplate(DelegatingDataSource.unwrapDataSource(dataSource)); //<2> + } + + @Transactional + List findByTitle(@NonNull @NotNull String title) { + return jdbcTemplate.queryForList('SELECT * FROM Book AS book WHERE book.title = ?', title) // <3> + .collect(m -> new Book(m.id as Long, m.title as String, m.pages as Integer)) + } +} +// end::clazz[] diff --git a/doc-examples/jdbc-spring-template-example-groovy/src/main/groovy/example/Book.groovy b/doc-examples/jdbc-spring-template-example-groovy/src/main/groovy/example/Book.groovy new file mode 100644 index 00000000000..03453ca6102 --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-groovy/src/main/groovy/example/Book.groovy @@ -0,0 +1,15 @@ +package example + +import groovy.transform.Canonical +import io.micronaut.core.annotation.Nullable +import io.micronaut.data.annotation.GeneratedValue +import io.micronaut.data.annotation.Id +import io.micronaut.data.annotation.MappedEntity + +@Canonical +@MappedEntity +class Book { + @Id @GeneratedValue @Nullable Long id + String title + int pages +} diff --git a/doc-examples/jdbc-spring-template-example-groovy/src/main/resources/application.yml b/doc-examples/jdbc-spring-template-example-groovy/src/main/resources/application.yml new file mode 100644 index 00000000000..25a69c44097 --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-groovy/src/main/resources/application.yml @@ -0,0 +1,8 @@ +datasources: + default: + url: jdbc:h2:mem:devDb;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE;NON_KEYWORDS=USER + driverClassName: org.h2.Driver + username: sa + password: '' + schema-generate: CREATE_DROP + dialect: H2 diff --git a/doc-examples/jdbc-spring-template-example-groovy/src/main/resources/logback.xml b/doc-examples/jdbc-spring-template-example-groovy/src/main/resources/logback.xml new file mode 100644 index 00000000000..abf9f39e7ed --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-groovy/src/main/resources/logback.xml @@ -0,0 +1,12 @@ + + + + + %cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg%n + + + + + + + diff --git a/doc-examples/jdbc-spring-template-example-groovy/src/test/groovy/example/BookRepositorySpec.groovy b/doc-examples/jdbc-spring-template-example-groovy/src/test/groovy/example/BookRepositorySpec.groovy new file mode 100644 index 00000000000..fc853990a2c --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-groovy/src/test/groovy/example/BookRepositorySpec.groovy @@ -0,0 +1,44 @@ +package example + +import io.micronaut.context.annotation.Property +import io.micronaut.test.extensions.spock.annotation.MicronautTest +import jakarta.inject.Inject +import spock.lang.Specification + +@MicronautTest(transactional = false) +@Property(name = 'spec.name', value = 'BookRepositorySpec') +@Property(name = 'datasources.default.name', value = 'mydb') +@Property(name = 'datasources.default.transaction-manager', value = 'springJdbc') +@Property(name = 'jpa.default.properties.hibernate.hbm2ddl.auto', value = 'create-drop') +class BookRepositorySpec extends Specification { + + @Inject + AbstractBookRepository bookRepository + + void "test Books JdbcTemplate"() { + given: + bookRepository.saveAll([ + new Book(null, 'The Stand', 1000), + new Book(null, 'The Shining', 600), + new Book(null, 'The Power of the Dog', 500), + new Book(null, 'The Border', 700), + new Book(null, 'Along Came a Spider', 300), + new Book(null, 'Pet Cemetery', 400), + new Book(null, 'A Game of Thrones', 900), + new Book(null, 'A Clash of Kings', 1100) + ]) + + when: + List result = bookRepository.findByTitle('The Shining') + + then: + result.size() == 1 + + result[0].id != null + result[0].title == 'The Shining' + result[0].pages == 600 + + cleanup: + bookRepository.deleteAll() + } +} diff --git a/doc-examples/jdbc-spring-template-example-java/build.gradle b/doc-examples/jdbc-spring-template-example-java/build.gradle new file mode 100644 index 00000000000..ad3a42987ed --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-java/build.gradle @@ -0,0 +1,22 @@ +plugins { + id "io.micronaut.build.internal.data-example" +} + +micronaut { + version libs.versions.micronaut.platform.get() + runtime "netty" + testRuntime "junit5" +} + +dependencies { + annotationProcessor projects.micronautDataProcessor + annotationProcessor mnValidation.micronaut.validation.processor + + implementation projects.micronautDataJdbc + implementation projects.micronautDataSpringJdbc + implementation mnValidation.micronaut.validation + + runtimeOnly mnSql.micronaut.jdbc.tomcat + runtimeOnly mnLogging.logback.classic + runtimeOnly mnSql.h2 +} diff --git a/doc-examples/jdbc-spring-template-example-java/gradle.properties b/doc-examples/jdbc-spring-template-example-java/gradle.properties new file mode 100644 index 00000000000..2f7c48213f8 --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-java/gradle.properties @@ -0,0 +1 @@ +skipDocumentation=true diff --git a/doc-examples/jdbc-spring-template-example-java/src/main/java/example/AbstractBookRepository.java b/doc-examples/jdbc-spring-template-example-java/src/main/java/example/AbstractBookRepository.java new file mode 100644 index 00000000000..5fd3ca6026d --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-java/src/main/java/example/AbstractBookRepository.java @@ -0,0 +1,36 @@ +package example; + +import io.micronaut.context.annotation.Requires; +import io.micronaut.core.annotation.NonNull; +import io.micronaut.data.connection.jdbc.advice.DelegatingDataSource; +import io.micronaut.data.jdbc.annotation.JdbcRepository; +import io.micronaut.data.model.query.builder.sql.Dialect; +import io.micronaut.data.repository.CrudRepository; +import jakarta.transaction.Transactional; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import org.springframework.jdbc.core.JdbcTemplate; + +import javax.sql.DataSource; +import java.util.List; + +@Requires(property = "spec.name", value = "BookRepositoryTest") +// tag::clazz[] +@JdbcRepository(dialect = Dialect.H2) +public abstract class AbstractBookRepository implements CrudRepository<@Valid Book, @NotNull Long> { + + private final JdbcTemplate jdbcTemplate; //<2> + + public AbstractBookRepository(DataSource dataSource) { // <1> + this.jdbcTemplate = new JdbcTemplate(DelegatingDataSource.unwrapDataSource(dataSource)); //<2> + } + + @Transactional + public List findByTitle(@NonNull @NotNull String title) { + return jdbcTemplate.queryForList("SELECT * FROM Book AS book WHERE book.title = ?", title) // <3> + .stream() + .map(m -> new Book((Long) m.get("id"), (String) m.get("title"), (Integer) m.get("pages"))) + .toList(); + } +} +// end::clazz[] diff --git a/doc-examples/jdbc-spring-template-example-java/src/main/java/example/Book.java b/doc-examples/jdbc-spring-template-example-java/src/main/java/example/Book.java new file mode 100644 index 00000000000..697b8735d78 --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-java/src/main/java/example/Book.java @@ -0,0 +1,15 @@ +package example; + +import io.micronaut.core.annotation.Nullable; +import io.micronaut.data.annotation.GeneratedValue; +import io.micronaut.data.annotation.Id; +import io.micronaut.data.annotation.MappedEntity; + +// tag::book[] +@MappedEntity +public record Book( + @Id @GeneratedValue @Nullable Long id, + String title, + int pages +) { } +// end::book[] diff --git a/doc-examples/jdbc-spring-template-example-java/src/main/resources/application.yml b/doc-examples/jdbc-spring-template-example-java/src/main/resources/application.yml new file mode 100644 index 00000000000..25a69c44097 --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-java/src/main/resources/application.yml @@ -0,0 +1,8 @@ +datasources: + default: + url: jdbc:h2:mem:devDb;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE;NON_KEYWORDS=USER + driverClassName: org.h2.Driver + username: sa + password: '' + schema-generate: CREATE_DROP + dialect: H2 diff --git a/doc-examples/jdbc-spring-template-example-java/src/main/resources/logback.xml b/doc-examples/jdbc-spring-template-example-java/src/main/resources/logback.xml new file mode 100644 index 00000000000..abf9f39e7ed --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-java/src/main/resources/logback.xml @@ -0,0 +1,12 @@ + + + + + %cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg%n + + + + + + + diff --git a/doc-examples/jdbc-spring-template-example-java/src/test/java/example/BookRepositoryTest.java b/doc-examples/jdbc-spring-template-example-java/src/test/java/example/BookRepositoryTest.java new file mode 100644 index 00000000000..0d17c7eec2e --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-java/src/test/java/example/BookRepositoryTest.java @@ -0,0 +1,50 @@ +package example; + +import io.micronaut.context.annotation.Property; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; +import jakarta.inject.Inject; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@MicronautTest +@Property(name = "spec.name", value = "BookRepositoryTest") +@Property(name = "datasources.default.name", value = "mydb") +@Property(name = "datasources.default.transaction-manager", value = "springJdbc") +@Property(name = "jpa.default.properties.hibernate.hbm2ddl.auto", value = "create-drop") +class BookRepositoryTest { + + @Inject + AbstractBookRepository bookRepository; + + @AfterEach + void cleanup() { + bookRepository.deleteAll(); + } + + @Test + void testBooksJdbcTemplate() { + bookRepository.saveAll(Arrays.asList( + new Book(null,"The Stand", 1000), + new Book(null,"The Shining", 600), + new Book(null,"The Power of the Dog", 500), + new Book(null,"The Border", 700), + new Book(null,"Along Came a Spider", 300), + new Book(null,"Pet Cemetery", 400), + new Book(null,"A Game of Thrones", 900), + new Book(null,"A Clash of Kings", 1100) + )); + + List result = bookRepository.findByTitle("The Shining"); + assertEquals(1, result.size()); + + assertNotNull(result.get(0).id()); + assertEquals("The Shining", result.get(0).title()); + assertEquals(600, result.get(0).pages()); + } +} diff --git a/doc-examples/jdbc-spring-template-example-kotlin/build.gradle b/doc-examples/jdbc-spring-template-example-kotlin/build.gradle new file mode 100644 index 00000000000..75c01508e96 --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-kotlin/build.gradle @@ -0,0 +1,25 @@ +plugins { + id "org.jetbrains.kotlin.jvm" + id "org.jetbrains.kotlin.kapt" + id "org.jetbrains.kotlin.plugin.allopen" + id "io.micronaut.build.internal.data-kotlin-example" +} + +micronaut { + version libs.versions.micronaut.platform.get() + runtime "netty" + testRuntime "junit5" +} + +dependencies { + kapt projects.micronautDataProcessor + kapt mnValidation.micronaut.validation.processor + + implementation projects.micronautDataJdbc + implementation projects.micronautDataSpringJdbc + implementation mnValidation.micronaut.validation + + runtimeOnly mnSql.micronaut.jdbc.tomcat + runtimeOnly mnLogging.logback.classic + runtimeOnly mnSql.h2 +} diff --git a/doc-examples/jdbc-spring-template-example-kotlin/gradle.properties b/doc-examples/jdbc-spring-template-example-kotlin/gradle.properties new file mode 100644 index 00000000000..2f7c48213f8 --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-kotlin/gradle.properties @@ -0,0 +1 @@ +skipDocumentation=true diff --git a/doc-examples/jdbc-spring-template-example-kotlin/src/main/kotlin/example/AbstractBookRepository.kt b/doc-examples/jdbc-spring-template-example-kotlin/src/main/kotlin/example/AbstractBookRepository.kt new file mode 100644 index 00000000000..fb0f133f584 --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-kotlin/src/main/kotlin/example/AbstractBookRepository.kt @@ -0,0 +1,25 @@ +package example + +import io.micronaut.context.annotation.Requires +import io.micronaut.data.connection.jdbc.advice.DelegatingDataSource +import io.micronaut.data.jdbc.annotation.JdbcRepository +import io.micronaut.data.model.query.builder.sql.Dialect +import io.micronaut.data.repository.CrudRepository +import jakarta.transaction.Transactional +import jakarta.validation.Valid +import javax.sql.DataSource +import org.springframework.jdbc.core.JdbcTemplate + +@Requires(property = "spec.name", value = "BookRepositoryTest") // tag::clazz[] +// tag::clazz[] +@JdbcRepository(dialect = Dialect.H2) +abstract class AbstractBookRepository(dataSource: DataSource) : CrudRepository<@Valid Book, Long> { // <1> + + private val jdbcTemplate: JdbcTemplate = JdbcTemplate(DelegatingDataSource.unwrapDataSource(dataSource)) //<2> + + @Transactional + open fun findByTitle(title: String) = jdbcTemplate + .queryForList("SELECT * FROM Book AS book WHERE book.title = ?", title) // <3> + .map { m -> Book(m["id"] as Long, m["title"] as String, m["pages"] as Int) } +} +// end::clazz[] diff --git a/doc-examples/jdbc-spring-template-example-kotlin/src/main/kotlin/example/Book.kt b/doc-examples/jdbc-spring-template-example-kotlin/src/main/kotlin/example/Book.kt new file mode 100644 index 00000000000..d9fe2873411 --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-kotlin/src/main/kotlin/example/Book.kt @@ -0,0 +1,14 @@ +package example + +import io.micronaut.data.annotation.GeneratedValue +import io.micronaut.data.annotation.Id +import io.micronaut.data.annotation.MappedEntity + +// tag::book[] +@MappedEntity +data class Book( + @field:Id @field:GeneratedValue val id: Long?, + val title: String, + val pages: Int +) +// end::book[] diff --git a/doc-examples/jdbc-spring-template-example-kotlin/src/main/resources/application.yml b/doc-examples/jdbc-spring-template-example-kotlin/src/main/resources/application.yml new file mode 100644 index 00000000000..25a69c44097 --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-kotlin/src/main/resources/application.yml @@ -0,0 +1,8 @@ +datasources: + default: + url: jdbc:h2:mem:devDb;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE;NON_KEYWORDS=USER + driverClassName: org.h2.Driver + username: sa + password: '' + schema-generate: CREATE_DROP + dialect: H2 diff --git a/doc-examples/jdbc-spring-template-example-kotlin/src/main/resources/logback.xml b/doc-examples/jdbc-spring-template-example-kotlin/src/main/resources/logback.xml new file mode 100644 index 00000000000..abf9f39e7ed --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-kotlin/src/main/resources/logback.xml @@ -0,0 +1,12 @@ + + + + + %cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg%n + + + + + + + diff --git a/doc-examples/jdbc-spring-template-example-kotlin/src/test/kotlin/example/BookRepositoryTest.kt b/doc-examples/jdbc-spring-template-example-kotlin/src/test/kotlin/example/BookRepositoryTest.kt new file mode 100644 index 00000000000..ba6ba922653 --- /dev/null +++ b/doc-examples/jdbc-spring-template-example-kotlin/src/test/kotlin/example/BookRepositoryTest.kt @@ -0,0 +1,48 @@ +package example + +import io.micronaut.context.annotation.Property +import io.micronaut.test.extensions.junit5.annotation.MicronautTest +import jakarta.inject.Inject +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertNotNull +import org.junit.jupiter.api.Test + +@MicronautTest +@Property(name = "spec.name", value = "BookRepositoryTest") +@Property(name = "datasources.default.name", value = "mydb") +@Property(name = "datasources.default.transaction-manager", value = "springJdbc") +@Property(name = "jpa.default.properties.hibernate.hbm2ddl.auto", value = "create-drop") +internal class BookRepositoryTest { + + @Inject + lateinit var bookRepository: AbstractBookRepository + + @AfterEach + fun cleanup() { + bookRepository.deleteAll() + } + + @Test + fun testBooksJdbcTemplate() { + bookRepository.saveAll( + listOf( + Book(null, "The Stand", 1000), + Book(null, "The Shining", 600), + Book(null, "The Power of the Dog", 500), + Book(null, "The Border", 700), + Book(null, "Along Came a Spider", 300), + Book(null, "Pet Cemetery", 400), + Book(null, "A Game of Thrones", 900), + Book(null, "A Clash of Kings", 1100) + ) + ) + + val result = bookRepository.findByTitle("The Shining") + assertEquals(1, result.size) + + assertNotNull(result[0].id) + assertEquals("The Shining", result[0].title) + assertEquals(600, result[0].pages) + } +} diff --git a/settings.gradle b/settings.gradle index a48d6b4c573..0b01b11af2b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -121,6 +121,10 @@ include 'doc-examples:azure-cosmos-example-kotlin' include 'doc-examples:jdbc-spring-tx-example-java' include 'doc-examples:hibernate-spring-tx-example-java' +include 'doc-examples:jdbc-spring-template-example-java' +include 'doc-examples:jdbc-spring-template-example-groovy' +include 'doc-examples:jdbc-spring-template-example-kotlin' + include 'doc-examples:jooq-r2dbc-postgres' include 'test-annotation-processor-java' diff --git a/src/main/docs/guide/dbc/dbcRepositories.adoc b/src/main/docs/guide/dbc/dbcRepositories.adoc index 79639112f9f..f38cc5cb6f8 100644 --- a/src/main/docs/guide/dbc/dbcRepositories.adoc +++ b/src/main/docs/guide/dbc/dbcRepositories.adoc @@ -34,4 +34,28 @@ As you can see from the above example, using abstract classes can be useful as i The example above uses the api:data.jdbc.runtime.JdbcOperations[] interface which simplifies executing JDBC queries within the context of transactions. -TIP: You could also inject whichever other tool you wish to use to handle more complex queries, such as QueryDSL, JOOQ, Spring JdbcTemplate etc. +You can also integrate whichever other tool you wish to use to handle more complex queries, such as QueryDSL, JOOQ, Spring JdbcTemplate etc. + +For example, to use link:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/core/JdbcTemplate.html[Spring JdbcTemplate], add the following dependencies: + +dependency:micronaut-data-jdbc[groupId="io.micronaut.data"] + +dependency:micronaut-data-spring-jdbc[groupId="io.micronaut.data"] + +The following code illustrates an example that integrates a `JdbcTemplate` instance as part of a api:data.jdbc.annotation.JdbcRepository[@JdbcRepository]. + +snippet::example.AbstractBookRepository[project-base="doc-examples/jdbc-spring-template-example",source="main",tags="clazz"] + +<1> Inject the `java.sql.DataSource` configured by the application. +<2> Instantiate a `JdbcTemplate` object using the injected `DataSource`. +<3> Now the `JdbcTemplate` API can be used to implement repository methods. + +In addition, the transaction manager for Spring JDBC needs to be set in application configuration. + +[configuration] +---- +datasources: + default: + transaction-manager: springJdbc +---- + From ed8b1a8edd5bb0f69c49dbff9e588cdc098e3265 Mon Sep 17 00:00:00 2001 From: Sergio del Amo Date: Tue, 19 Sep 2023 09:34:44 +0200 Subject: [PATCH 18/24] test: use transactionManager instead of transaction-manager --- .../src/test/groovy/example/BookRepositorySpec.groovy | 2 +- .../src/test/java/example/BookRepositoryTest.java | 2 +- .../src/test/kotlin/example/BookRepositoryTest.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc-examples/jdbc-spring-template-example-groovy/src/test/groovy/example/BookRepositorySpec.groovy b/doc-examples/jdbc-spring-template-example-groovy/src/test/groovy/example/BookRepositorySpec.groovy index fc853990a2c..454dd53c6f8 100644 --- a/doc-examples/jdbc-spring-template-example-groovy/src/test/groovy/example/BookRepositorySpec.groovy +++ b/doc-examples/jdbc-spring-template-example-groovy/src/test/groovy/example/BookRepositorySpec.groovy @@ -8,7 +8,7 @@ import spock.lang.Specification @MicronautTest(transactional = false) @Property(name = 'spec.name', value = 'BookRepositorySpec') @Property(name = 'datasources.default.name', value = 'mydb') -@Property(name = 'datasources.default.transaction-manager', value = 'springJdbc') +@Property(name = 'datasources.default.transactionManager', value = 'springJdbc') @Property(name = 'jpa.default.properties.hibernate.hbm2ddl.auto', value = 'create-drop') class BookRepositorySpec extends Specification { diff --git a/doc-examples/jdbc-spring-template-example-java/src/test/java/example/BookRepositoryTest.java b/doc-examples/jdbc-spring-template-example-java/src/test/java/example/BookRepositoryTest.java index 0d17c7eec2e..a1484a5c668 100644 --- a/doc-examples/jdbc-spring-template-example-java/src/test/java/example/BookRepositoryTest.java +++ b/doc-examples/jdbc-spring-template-example-java/src/test/java/example/BookRepositoryTest.java @@ -15,7 +15,7 @@ @MicronautTest @Property(name = "spec.name", value = "BookRepositoryTest") @Property(name = "datasources.default.name", value = "mydb") -@Property(name = "datasources.default.transaction-manager", value = "springJdbc") +@Property(name = "datasources.default.transactionManager", value = "springJdbc") @Property(name = "jpa.default.properties.hibernate.hbm2ddl.auto", value = "create-drop") class BookRepositoryTest { diff --git a/doc-examples/jdbc-spring-template-example-kotlin/src/test/kotlin/example/BookRepositoryTest.kt b/doc-examples/jdbc-spring-template-example-kotlin/src/test/kotlin/example/BookRepositoryTest.kt index ba6ba922653..ef38d7c1299 100644 --- a/doc-examples/jdbc-spring-template-example-kotlin/src/test/kotlin/example/BookRepositoryTest.kt +++ b/doc-examples/jdbc-spring-template-example-kotlin/src/test/kotlin/example/BookRepositoryTest.kt @@ -11,7 +11,7 @@ import org.junit.jupiter.api.Test @MicronautTest @Property(name = "spec.name", value = "BookRepositoryTest") @Property(name = "datasources.default.name", value = "mydb") -@Property(name = "datasources.default.transaction-manager", value = "springJdbc") +@Property(name = "datasources.default.transactionManager", value = "springJdbc") @Property(name = "jpa.default.properties.hibernate.hbm2ddl.auto", value = "create-drop") internal class BookRepositoryTest { From c1262acecf3127323df4ea1a549232d72174da4e Mon Sep 17 00:00:00 2001 From: micronaut-build Date: Tue, 19 Sep 2023 09:09:36 +0000 Subject: [PATCH 19/24] [skip ci] Release v4.1.3 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 675783914a7..1d5cc4277da 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -projectVersion=4.1.3-SNAPSHOT +projectVersion=4.1.3 projectGroupId=io.micronaut.data title=Micronaut Data From edfceec91198b33d5f766f76a60212147f0aca4d Mon Sep 17 00:00:00 2001 From: micronaut-build Date: Tue, 19 Sep 2023 09:23:15 +0000 Subject: [PATCH 20/24] Back to 4.1.4-SNAPSHOT --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 1d5cc4277da..6717ae99468 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -projectVersion=4.1.3 +projectVersion=4.1.4-SNAPSHOT projectGroupId=io.micronaut.data title=Micronaut Data From 3ca5e1f2dddd57f452ce4b66e78129a376f78ac1 Mon Sep 17 00:00:00 2001 From: radovanradic Date: Mon, 9 Oct 2023 16:40:49 +0200 Subject: [PATCH 21/24] Fix JPA sort issue for embedded field (#2550) --- .../AbstractHibernateQuerySpec.groovy | 24 +++++++++++++++ .../hibernate/UserWithWhereRepository.java | 5 ++++ .../data/hibernate/entities/Audit.java | 29 +++++++++++++++++++ .../hibernate/entities/UserWithWhere.java | 12 ++++++++ .../builder/AbstractSqlLikeQueryBuilder.java | 3 +- 5 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/entities/Audit.java diff --git a/data-hibernate-jpa/src/test/groovy/io/micronaut/data/hibernate/AbstractHibernateQuerySpec.groovy b/data-hibernate-jpa/src/test/groovy/io/micronaut/data/hibernate/AbstractHibernateQuerySpec.groovy index 57c47d5c1b7..e7f3804556b 100644 --- a/data-hibernate-jpa/src/test/groovy/io/micronaut/data/hibernate/AbstractHibernateQuerySpec.groovy +++ b/data-hibernate-jpa/src/test/groovy/io/micronaut/data/hibernate/AbstractHibernateQuerySpec.groovy @@ -83,6 +83,8 @@ abstract class AbstractHibernateQuerySpec extends AbstractQuerySpec { def found = userWithWhereRepository.findById(e.id) then: found.isPresent() + cleanup: + userWithWhereRepository.deleteById(e.id) } void "test @where on find one deleted"() { @@ -729,6 +731,28 @@ abstract class AbstractHibernateQuerySpec extends AbstractQuerySpec { result.size() == 0 } + void "test order by embedded field"() { + when: + def e1 = userWithWhereRepository.save(new UserWithWhere(id: UUID.randomUUID(), email: "where1@somewhere.com", deleted: false)) + def u2 = new UserWithWhere(id: UUID.randomUUID(), email: "where2@somewhere.com", deleted: false) + u2.audit.createdTime = u2.audit.createdTime.plusSeconds(30) + def e2 = userWithWhereRepository.save(u2) + def found1 = userWithWhereRepository.findById(e1.id) + def found2 = userWithWhereRepository.findById(e2.id) + then: + found1.present + found2.present + when:"Sorted by embedded field works" + def sortedItems = userWithWhereRepository.findAllByIdInList(List.of(e1.id, e2.id), Sort.of(Sort.Order.desc("audit.createdTime", false))) + then: + sortedItems + sortedItems.size() == 2 + sortedItems[0].id == e2.id + sortedItems[1].id == e1.id + cleanup: + userWithWhereRepository.deleteAll(List.of(e1, e2)) + } + private static Specification testJoin(String value) { return ((root, query, criteriaBuilder) -> criteriaBuilder.equal(root.join("author").get("name"), value)) } diff --git a/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/UserWithWhereRepository.java b/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/UserWithWhereRepository.java index 61db4e03c3b..1832d0bec88 100644 --- a/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/UserWithWhereRepository.java +++ b/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/UserWithWhereRepository.java @@ -1,11 +1,16 @@ package io.micronaut.data.hibernate; +import io.micronaut.core.annotation.NonNull; import io.micronaut.data.annotation.Repository; import io.micronaut.data.hibernate.entities.UserWithWhere; +import io.micronaut.data.model.Sort; import io.micronaut.data.repository.CrudRepository; +import java.util.List; import java.util.UUID; @Repository public interface UserWithWhereRepository extends CrudRepository { + + List findAllByIdInList(List ids, @NonNull Sort sort); } diff --git a/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/entities/Audit.java b/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/entities/Audit.java new file mode 100644 index 00000000000..2cfb3ca8c11 --- /dev/null +++ b/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/entities/Audit.java @@ -0,0 +1,29 @@ +package io.micronaut.data.hibernate.entities; + +import io.micronaut.data.annotation.Embeddable; + +import java.time.Instant; + +@Embeddable +public class Audit { + + private Instant createdTime = Instant.now(); + + private String createdBy = "current"; + + public Instant getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Instant createdTime) { + this.createdTime = createdTime; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } +} diff --git a/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/entities/UserWithWhere.java b/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/entities/UserWithWhere.java index 264805c6c84..0c3167d13ff 100644 --- a/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/entities/UserWithWhere.java +++ b/data-hibernate-jpa/src/test/java/io/micronaut/data/hibernate/entities/UserWithWhere.java @@ -1,8 +1,10 @@ package io.micronaut.data.hibernate.entities; +import io.micronaut.data.annotation.Embeddable; import io.micronaut.data.annotation.Where; import jakarta.persistence.Column; +import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; @@ -17,6 +19,8 @@ public class UserWithWhere { private UUID id; private String email; private Boolean deleted; + @Embedded + private Audit audit = new Audit(); public UUID getId() { return id; @@ -41,4 +45,12 @@ public Boolean getDeleted() { public void setDeleted(Boolean deleted) { this.deleted = deleted; } + + public Audit getAudit() { + return audit; + } + + public void setAudit(Audit audit) { + this.audit = audit; + } } diff --git a/data-model/src/main/java/io/micronaut/data/model/query/builder/AbstractSqlLikeQueryBuilder.java b/data-model/src/main/java/io/micronaut/data/model/query/builder/AbstractSqlLikeQueryBuilder.java index a5486eff7bd..14db25d5035 100644 --- a/data-model/src/main/java/io/micronaut/data/model/query/builder/AbstractSqlLikeQueryBuilder.java +++ b/data-model/src/main/java/io/micronaut/data/model/query/builder/AbstractSqlLikeQueryBuilder.java @@ -1803,7 +1803,8 @@ public QueryResult buildOrderBy(String query, @NonNull PersistentEntity entity, List associations = new ArrayList<>(path.getAssociations()); int assocCount = associations.size(); // If last association is embedded, it does not need to be joined to the alias since it will be in the destination table - if (assocCount > 0 && associations.get(assocCount - 1) instanceof Embedded) { + // JPA/Hibernate is special case and in that case we leave association for specific handling below + if (assocCount > 0 && computePropertyPaths() && associations.get(assocCount - 1) instanceof Embedded) { associations.remove(assocCount - 1); } if (associations.isEmpty()) { From 8b18b816a7cc4ad939aa2b5dbb30923c72fb67ac Mon Sep 17 00:00:00 2001 From: micronaut-build Date: Mon, 9 Oct 2023 15:12:47 +0000 Subject: [PATCH 22/24] [skip ci] Release v4.1.4 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 6717ae99468..d5734a29d26 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -projectVersion=4.1.4-SNAPSHOT +projectVersion=4.1.4 projectGroupId=io.micronaut.data title=Micronaut Data From 8100ccb5607d374c5757d8588b829e5df762a9de Mon Sep 17 00:00:00 2001 From: micronaut-build Date: Mon, 9 Oct 2023 15:21:41 +0000 Subject: [PATCH 23/24] Back to 4.1.5-SNAPSHOT --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index d5734a29d26..c278613464f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -projectVersion=4.1.4 +projectVersion=4.1.5-SNAPSHOT projectGroupId=io.micronaut.data title=Micronaut Data From 78451e0420b7d841a60f30b95bf20220ecd454a6 Mon Sep 17 00:00:00 2001 From: Denis Stepanov Date: Tue, 10 Oct 2023 10:00:21 +0300 Subject: [PATCH 24/24] Correct docs --- .../src/main/groovy/example/AbstractBookRepository.groovy | 2 +- .../src/main/java/example/AbstractBookRepository.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc-examples/jdbc-spring-template-example-groovy/src/main/groovy/example/AbstractBookRepository.groovy b/doc-examples/jdbc-spring-template-example-groovy/src/main/groovy/example/AbstractBookRepository.groovy index fa50422d035..b9d060ebad6 100644 --- a/doc-examples/jdbc-spring-template-example-groovy/src/main/groovy/example/AbstractBookRepository.groovy +++ b/doc-examples/jdbc-spring-template-example-groovy/src/main/groovy/example/AbstractBookRepository.groovy @@ -18,7 +18,7 @@ import javax.sql.DataSource @JdbcRepository(dialect = Dialect.H2) abstract class AbstractBookRepository implements CrudRepository<@Valid Book, @NotNull Long> { - private final JdbcTemplate jdbcTemplate; //<2> + private final JdbcTemplate jdbcTemplate; AbstractBookRepository(DataSource dataSource) { // <1> this.jdbcTemplate = new JdbcTemplate(DelegatingDataSource.unwrapDataSource(dataSource)); //<2> diff --git a/doc-examples/jdbc-spring-template-example-java/src/main/java/example/AbstractBookRepository.java b/doc-examples/jdbc-spring-template-example-java/src/main/java/example/AbstractBookRepository.java index 5fd3ca6026d..f6b73bc1439 100644 --- a/doc-examples/jdbc-spring-template-example-java/src/main/java/example/AbstractBookRepository.java +++ b/doc-examples/jdbc-spring-template-example-java/src/main/java/example/AbstractBookRepository.java @@ -19,7 +19,7 @@ @JdbcRepository(dialect = Dialect.H2) public abstract class AbstractBookRepository implements CrudRepository<@Valid Book, @NotNull Long> { - private final JdbcTemplate jdbcTemplate; //<2> + private final JdbcTemplate jdbcTemplate; public AbstractBookRepository(DataSource dataSource) { // <1> this.jdbcTemplate = new JdbcTemplate(DelegatingDataSource.unwrapDataSource(dataSource)); //<2>