From 13f5e1705d447d1fd61c1efe1f8c02884af9452b Mon Sep 17 00:00:00 2001 From: bagger3025 Date: Fri, 11 Oct 2024 12:46:51 +0900 Subject: [PATCH] fix: silently ignores exception when parameter setting to count query --- .../data/jpa/javax/JpqlEntityManagerUtils.kt | 27 ++++++++++++++++++- .../spring/data/jpa/JpqlEntityManagerUtils.kt | 27 ++++++++++++++++++- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/support/spring-data-jpa-javax/src/main/kotlin/com/linecorp/kotlinjdsl/support/spring/data/jpa/javax/JpqlEntityManagerUtils.kt b/support/spring-data-jpa-javax/src/main/kotlin/com/linecorp/kotlinjdsl/support/spring/data/jpa/javax/JpqlEntityManagerUtils.kt index dd00be131..904c41ea3 100644 --- a/support/spring-data-jpa-javax/src/main/kotlin/com/linecorp/kotlinjdsl/support/spring/data/jpa/javax/JpqlEntityManagerUtils.kt +++ b/support/spring-data-jpa-javax/src/main/kotlin/com/linecorp/kotlinjdsl/support/spring/data/jpa/javax/JpqlEntityManagerUtils.kt @@ -4,6 +4,7 @@ package com.linecorp.kotlinjdsl.support.spring.data.jpa.javax import com.linecorp.kotlinjdsl.querymodel.jpql.JpqlQuery import com.linecorp.kotlinjdsl.render.RenderContext +import org.slf4j.LoggerFactory import org.springframework.data.domain.Sort import org.springframework.data.jpa.repository.query.QueryEnhancerFactoryAdaptor import javax.persistence.EntityManager @@ -71,7 +72,17 @@ internal object JpqlEntityManagerUtils { createQuery(entityManager, queryEnhancer.applySorting(sort), rendered.params, returnType.java), ) { // Lazy - createQuery(entityManager, queryEnhancer.createCountQueryFor(), rendered.params, Long::class.javaObjectType) + createCountQuery(entityManager, queryEnhancer.createCountQueryFor(), rendered.params) + } + } + + private fun createCountQuery( + entityManager: EntityManager, + query: String, + queryParams: Map, + ): TypedQuery { + return entityManager.createQuery(query, Long::class.javaObjectType).apply { + setCountQueryParams(this, queryParams) } } @@ -96,9 +107,23 @@ internal object JpqlEntityManagerUtils { } } + private fun setCountQueryParams(query: Query, params: Map) { + params.forEach { (name, value) -> + try { + query.setParameter(name, value) + } catch (e: RuntimeException) { + if (log.isDebugEnabled) { + log.debug("Silently ignoring", e) + } + } + } + } + private fun setParams(query: Query, params: Map) { params.forEach { (name, value) -> query.setParameter(name, value) } } } + +private val log = LoggerFactory.getLogger(JpqlEntityManagerUtils::class.java) diff --git a/support/spring-data-jpa/src/main/kotlin/com/linecorp/kotlinjdsl/support/spring/data/jpa/JpqlEntityManagerUtils.kt b/support/spring-data-jpa/src/main/kotlin/com/linecorp/kotlinjdsl/support/spring/data/jpa/JpqlEntityManagerUtils.kt index 5265e69bc..9e75dd7ca 100644 --- a/support/spring-data-jpa/src/main/kotlin/com/linecorp/kotlinjdsl/support/spring/data/jpa/JpqlEntityManagerUtils.kt +++ b/support/spring-data-jpa/src/main/kotlin/com/linecorp/kotlinjdsl/support/spring/data/jpa/JpqlEntityManagerUtils.kt @@ -7,6 +7,7 @@ import com.linecorp.kotlinjdsl.render.RenderContext import jakarta.persistence.EntityManager import jakarta.persistence.Query import jakarta.persistence.TypedQuery +import org.slf4j.LoggerFactory import org.springframework.data.domain.Sort import org.springframework.data.jpa.repository.query.QueryEnhancerFactoryAdaptor import kotlin.reflect.KClass @@ -71,7 +72,17 @@ internal object JpqlEntityManagerUtils { createQuery(entityManager, queryEnhancer.applySorting(sort), rendered.params, returnType.java), ) { // Lazy - createQuery(entityManager, queryEnhancer.createCountQueryFor(), rendered.params, Long::class.javaObjectType) + createCountQuery(entityManager, queryEnhancer.createCountQueryFor(), rendered.params) + } + } + + private fun createCountQuery( + entityManager: EntityManager, + query: String, + queryParams: Map, + ): TypedQuery { + return entityManager.createQuery(query, Long::class.javaObjectType).apply { + setCountQueryParams(this, queryParams) } } @@ -96,9 +107,23 @@ internal object JpqlEntityManagerUtils { } } + private fun setCountQueryParams(query: Query, params: Map) { + params.forEach { (name, value) -> + try { + query.setParameter(name, value) + } catch (e: RuntimeException) { + if (log.isDebugEnabled) { + log.debug("Silently ignoring", e) + } + } + } + } + private fun setParams(query: Query, params: Map) { params.forEach { (name, value) -> query.setParameter(name, value) } } } + +private val log = LoggerFactory.getLogger(JpqlEntityManagerUtils::class.java)