From 0d47c2ec7c93648296b6cb69ac9f250ff3d54add Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Fri, 10 Apr 2026 13:26:18 +0200 Subject: [PATCH] fix: avoid null bytea in audit search JPQL Hibernate binds null String params as bytea, causing PostgreSQL lower(bytea) error. Convert null search to empty string in service layer, use empty-string check in JPQL instead of IS NULL. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../net/siegeln/cameleer/saas/audit/AuditRepository.java | 6 +++--- .../java/net/siegeln/cameleer/saas/audit/AuditService.java | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/siegeln/cameleer/saas/audit/AuditRepository.java b/src/main/java/net/siegeln/cameleer/saas/audit/AuditRepository.java index 408cb89..fedd587 100644 --- a/src/main/java/net/siegeln/cameleer/saas/audit/AuditRepository.java +++ b/src/main/java/net/siegeln/cameleer/saas/audit/AuditRepository.java @@ -25,9 +25,9 @@ public interface AuditRepository extends JpaRepository { AND (:result IS NULL OR a.result = :result) AND (:from IS NULL OR a.createdAt >= :from) AND (:to IS NULL OR a.createdAt <= :to) - AND (:search IS NULL - OR LOWER(a.actorEmail) LIKE LOWER(CONCAT('%', COALESCE(:search, ''), '%')) - OR LOWER(a.resource) LIKE LOWER(CONCAT('%', COALESCE(:search, ''), '%'))) + AND (:search = '' + OR LOWER(a.actorEmail) LIKE LOWER(CONCAT('%', :search, '%')) + OR LOWER(a.resource) LIKE LOWER(CONCAT('%', :search, '%'))) ORDER BY a.createdAt DESC """) Page findFiltered( diff --git a/src/main/java/net/siegeln/cameleer/saas/audit/AuditService.java b/src/main/java/net/siegeln/cameleer/saas/audit/AuditService.java index 6d13e09..87bea93 100644 --- a/src/main/java/net/siegeln/cameleer/saas/audit/AuditService.java +++ b/src/main/java/net/siegeln/cameleer/saas/audit/AuditService.java @@ -37,6 +37,7 @@ public class AuditService { public Page search(UUID tenantId, String action, String result, Instant from, Instant to, String search, Pageable pageable) { - return auditRepository.findFiltered(tenantId, action, result, from, to, search, pageable); + String safeSearch = (search != null && !search.isBlank()) ? search.trim() : ""; + return auditRepository.findFiltered(tenantId, action, result, from, to, safeSearch, pageable); } }