From 0cbe33436d2bc070c53fdf00d90a215679b8cca3 Mon Sep 17 00:00:00 2001 From: dongmucat <1127093059@qq.com> Date: Mon, 27 Jul 2026 17:29:12 +0800 Subject: [PATCH] fix(namespace): type nullable search terms Signed-off-by: dongmucat <1127093059@qq.com> --- .../infra/jpa/NamespaceJpaRepositoryTest.java | 14 ++++++++++++++ .../skillhub/infra/jpa/NamespaceJpaRepository.java | 8 ++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/server/skillhub-app/src/test/java/com/iflytek/skillhub/infra/jpa/NamespaceJpaRepositoryTest.java b/server/skillhub-app/src/test/java/com/iflytek/skillhub/infra/jpa/NamespaceJpaRepositoryTest.java index 2232a894..255387cb 100644 --- a/server/skillhub-app/src/test/java/com/iflytek/skillhub/infra/jpa/NamespaceJpaRepositoryTest.java +++ b/server/skillhub-app/src/test/java/com/iflytek/skillhub/infra/jpa/NamespaceJpaRepositoryTest.java @@ -66,6 +66,20 @@ class NamespaceJpaRepositoryTest { .containsExactly("underscore-team"); } + @Test + void search_acceptsNullQueryAlongsideOtherFilters() { + var page = repository.search( + NamespaceStatus.ACTIVE, + NamespaceType.TEAM, + null, + "percent-team", + PageRequest.of(0, 1) + ); + + assertThat(page.getContent()).extracting(Namespace::getSlug) + .containsExactly("percent-team"); + } + private Namespace persist(Namespace namespace) { entityManager.persist(namespace); return namespace; diff --git a/server/skillhub-infra/src/main/java/com/iflytek/skillhub/infra/jpa/NamespaceJpaRepository.java b/server/skillhub-infra/src/main/java/com/iflytek/skillhub/infra/jpa/NamespaceJpaRepository.java index 4476f961..07fa8e94 100644 --- a/server/skillhub-infra/src/main/java/com/iflytek/skillhub/infra/jpa/NamespaceJpaRepository.java +++ b/server/skillhub-infra/src/main/java/com/iflytek/skillhub/infra/jpa/NamespaceJpaRepository.java @@ -32,8 +32,8 @@ public interface NamespaceJpaRepository AND (:type IS NULL OR n.type = :type) AND ( :query IS NULL - OR lower(n.slug) LIKE lower(concat('%', :query, '%')) ESCAPE '!' - OR lower(n.displayName) LIKE lower(concat('%', :query, '%')) ESCAPE '!' + OR lower(n.slug) LIKE lower(concat('%', cast(:query as string), '%')) ESCAPE '!' + OR lower(n.displayName) LIKE lower(concat('%', cast(:query as string), '%')) ESCAPE '!' ) AND (:slug IS NULL OR n.slug = :slug) """) @@ -52,8 +52,8 @@ public interface NamespaceJpaRepository AND (:type IS NULL OR n.type = :type) AND ( :query IS NULL - OR lower(n.slug) LIKE lower(concat('%', :query, '%')) ESCAPE '!' - OR lower(n.displayName) LIKE lower(concat('%', :query, '%')) ESCAPE '!' + OR lower(n.slug) LIKE lower(concat('%', cast(:query as string), '%')) ESCAPE '!' + OR lower(n.displayName) LIKE lower(concat('%', cast(:query as string), '%')) ESCAPE '!' ) AND (:slug IS NULL OR n.slug = :slug) """)