From 2b3fe2b029dde0205d0e238a77b42004a517b1d9 Mon Sep 17 00:00:00 2001 From: Xiangcheng Kuo <1159946129@qq.com> Date: Thu, 11 Sep 2025 11:53:09 +0800 Subject: [PATCH] Fix projection query field mapping issue When using projection queries with entities that have @Attribute annotations for LDAP field mapping, the query was using Java field names instead of the mapped LDAP attribute names. This caused queries to fail when the Java field name differs from the LDAP attribute name. Changes: - Modified LdapQueryCreator to map projection fields using ObjectDirectoryMapper.attributeFor() method - Updated test assertions to verify correct LDAP attribute names are used in queries (e.g., "sn" instead of "lastName") Example: For an entity field 'groupId' mapped to LDAP attribute 'gidNumber' via @Attribute annotation, projection queries now correctly use 'gidNumber' in the LDAP query. Fixes projection queries for entities with custom LDAP attribute mappings. Signed-off-by: Xiangcheng Kuo <1159946129@qq.com> --- .../data/ldap/repository/query/LdapQueryCreator.java | 3 ++- .../data/ldap/repository/LdapRepositoryUnitTests.java | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/springframework/data/ldap/repository/query/LdapQueryCreator.java b/src/main/java/org/springframework/data/ldap/repository/query/LdapQueryCreator.java index 6dcb3bf3..7bcf2b35 100644 --- a/src/main/java/org/springframework/data/ldap/repository/query/LdapQueryCreator.java +++ b/src/main/java/org/springframework/data/ldap/repository/query/LdapQueryCreator.java @@ -39,6 +39,7 @@ * * @author Mattias Hellborg Arthursson * @author Mark Paluch + * @author Xiangcheng Kuo */ class LdapQueryCreator extends AbstractQueryCreator { @@ -80,7 +81,7 @@ protected ContainerCriteria create(Part part, Iterator iterator) { } if (!inputProperties.isEmpty()) { - query.attributes(inputProperties.toArray(new String[0])); + query.attributes(inputProperties.stream().map(prop -> mapper.attributeFor(entityType, prop)).toList().toArray(new String[0])); } ConditionCriteria criteria = query.where(getAttribute(part)); diff --git a/src/test/java/org/springframework/data/ldap/repository/LdapRepositoryUnitTests.java b/src/test/java/org/springframework/data/ldap/repository/LdapRepositoryUnitTests.java index ea931264..e1f7b8f6 100644 --- a/src/test/java/org/springframework/data/ldap/repository/LdapRepositoryUnitTests.java +++ b/src/test/java/org/springframework/data/ldap/repository/LdapRepositoryUnitTests.java @@ -78,7 +78,7 @@ void shouldReturnInterfaceProjection() { verify(ldapOperations).findOne(captor.capture(), any()); LdapQuery query = captor.getValue(); - assertThat(query.attributes()).containsOnly("lastName"); + assertThat(query.attributes()).containsOnly("sn"); } @Test @@ -96,7 +96,7 @@ void shouldReturnDynamicDtoProjection() { verify(ldapOperations).findOne(captor.capture(), any()); LdapQuery query = captor.getValue(); - assertThat(query.attributes()).contains("lastName"); + assertThat(query.attributes()).contains("sn"); } @Test @@ -115,7 +115,7 @@ void shouldReturnInterfaceProjectionAsStream() { verify(ldapOperations).find(captor.capture(), any()); LdapQuery query = captor.getValue(); - assertThat(query.attributes()).containsOnly("lastName"); + assertThat(query.attributes()).containsOnly("sn"); } interface PersonRepository extends LdapRepository {