spring-data-relational icon indicating copy to clipboard operation
spring-data-relational copied to clipboard

JDBC: QBE withIgnoreNullValues does not ignore nulls in embedded classes of the Example

Open dschulten opened this issue 11 months ago • 3 comments

I have an example Spring Data Jdbc Aggregate Root (not JPA)

@RequiredArgsConstructor(access = AccessLevel.PACKAGE, onConstructor = @__(@PersistenceCreator))
public class Person implements AggregateRoot<Person, PersonIdentifier> {

   @Id private final PersonIdentifier id
   
    private String name;
    
    @Getter
    @Embedded 
    private Address address;
}

with an embedded VO record:

public record Address(String city, String street} implements ValueObject

When I have three people, two persons who live in streets of Heilbronn and one Person who lives in a street of Berlin, and I run this qbe Query on my QueryByExampleExecutor:

personRepository.findAll(
        Example.of(
            person,
            ExampleMatcher.matching().withIgnorePaths("id").withIgnoreNullValues()));

with this Person:

{
	"address": {		
		"city": "Heilbronn"
	}
}

I get no matches, because the generated query specifically asks for Persons with STREET = null. That only happens for embedded types - the generated query does not ask for persons where NAME == null, apparently because name is a top-level attribute. Log extract:

WHERE (("PERSON"."CITY" = ? AND "PERSON"."STREET" = ?))
Setting SQL statement parameter value: column index 1, parameter value [Heilbronn], value class [java.lang.String], SQL type 12
Setting SQL statement parameter value: column index 2, parameter value [null], value class [null], SQL type 12

I would expect two matches, all persons who live in Heilbronn.

Am I holding it wrong, or is ignoreNullValues simply not supported for embedded types?

dschulten avatar Jan 31 '25 06:01 dschulten

Example works on properties (and nested property paths). Embedding is merely a way to represent values in the table while the logical model should not care about embedding. I consider this a bug.

mp911de avatar Jan 31 '25 08:01 mp911de

I'll take a look at it, @mp911de, if you do not mind :)

mipo256 avatar Jul 24 '25 19:07 mipo256

Sure, go ahead.

schauder avatar Jul 25 '25 05:07 schauder