From 41f523368fecfda20596106d3543fcb92e46c753 Mon Sep 17 00:00:00 2001 From: mikereiche Date: Thu, 12 Jun 2025 15:48:02 -0700 Subject: [PATCH] Project mangled field names. Closes #2057. --- .../core/convert/MappingCouchbaseConverter.java | 2 +- .../repository/query/StringBasedN1qlQueryParser.java | 9 ++++++++- ...seRepositoryFieldLevelEncryptionIntegrationTests.java | 4 ++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/couchbase/core/convert/MappingCouchbaseConverter.java b/src/main/java/org/springframework/data/couchbase/core/convert/MappingCouchbaseConverter.java index 83b932f45..f704e4083 100644 --- a/src/main/java/org/springframework/data/couchbase/core/convert/MappingCouchbaseConverter.java +++ b/src/main/java/org/springframework/data/couchbase/core/convert/MappingCouchbaseConverter.java @@ -1154,7 +1154,7 @@ public R getPropertyValue(final CouchbasePersistentProperty property) { } } - String maybeMangle(PersistentProperty property) { + public String maybeMangle(PersistentProperty property) { Assert.notNull(property, "property"); if (!conversions.hasValueConverter(property)) { return ((CouchbasePersistentProperty) property).getFieldName(); diff --git a/src/main/java/org/springframework/data/couchbase/repository/query/StringBasedN1qlQueryParser.java b/src/main/java/org/springframework/data/couchbase/repository/query/StringBasedN1qlQueryParser.java index 6e21c8ea0..0c298a6f1 100644 --- a/src/main/java/org/springframework/data/couchbase/repository/query/StringBasedN1qlQueryParser.java +++ b/src/main/java/org/springframework/data/couchbase/repository/query/StringBasedN1qlQueryParser.java @@ -32,6 +32,7 @@ import org.slf4j.LoggerFactory; import org.springframework.data.couchbase.core.convert.CouchbaseConverter; +import org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter; import org.springframework.data.couchbase.core.mapping.CouchbaseDocument; import org.springframework.data.couchbase.core.mapping.CouchbaseList; import org.springframework.data.couchbase.core.mapping.CouchbasePersistentProperty; @@ -328,7 +329,13 @@ private void getProjectedFieldsInternal(String bucketName, CouchbasePersistentPr if (fieldList == null || fieldList.contains(prop.getFieldName())) { PersistentPropertyPath path = couchbaseConverter.getMappingContext() .getPersistentPropertyPath(prop.getName(), persistentEntity.getTypeInformation().getType()); - projectField = N1qlQueryCreator.addMetaIfRequired(bucketName, path, prop, persistentEntity).toString(); + String unmangled = prop.getFieldName(); + String maybeMangled =((MappingCouchbaseConverter)couchbaseConverter).maybeMangle(prop); + if(maybeMangled.equals(unmangled)) { + projectField = N1qlQueryCreator.addMetaIfRequired(bucketName, path, prop, persistentEntity).toString(); + } else { + projectField = i(maybeMangled).toString(); + } if (sb.length() > 0) { sb.append(", "); } diff --git a/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryFieldLevelEncryptionIntegrationTests.java b/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryFieldLevelEncryptionIntegrationTests.java index 727d69879..99774cfa5 100644 --- a/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryFieldLevelEncryptionIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryFieldLevelEncryptionIntegrationTests.java @@ -154,10 +154,14 @@ void writeSpring_readSpring() { assertFalse(userEncryptedRepository.existsById(user.getId())); userEncryptedRepository.save(user); // read the user with Spring + Optional writeSpringReadSpring = userEncryptedRepository.findById(user.getId()); assertTrue(writeSpringReadSpring.isPresent()); writeSpringReadSpring.ifPresent(u -> assertEquals(user, u)); + List writeSpringReadSpring2 = userEncryptedRepository.findAll(); + assertEquals(user, writeSpringReadSpring2.stream().filter(u -> u.getId().equals(user.getId())).findFirst().get()); + if (cleanAfter) { try { couchbaseTemplate.removeById(UserEncrypted.class).one(user.getId());