"Unable to ignore case of java.lang.String types", ignoreCase combined with Contains not working


(Moritz Loeser) #1

So far Spring-Data-Neo4J works great but now i am hitting a problem:

In one of my "Neo4jRepository" for ProductResponsibleUnitRelation i declare a method:

List<ProductResponsibleUnitRelation> findByProductHierarchyIdContainingIgnoreCase(String partialProductHierarchyId);

Using this method yields this exception:

Caused by: java.lang.IllegalStateException: Unable to ignore case of java.lang.String types, the property 'productHierarchy' must reference a String
	at org.springframework.util.Assert.state(Assert.java:73)
	at org.springframework.data.neo4j.repository.query.filter.PropertyComparisonBuilder.applyCaseInsensitivityIfShouldIgnoreCase(PropertyComparisonBuilder.java:101)
	at org.springframework.data.neo4j.repository.query.filter.PropertyComparisonBuilder.build(PropertyComparisonBuilder.java:49)

Inspecting code of org.springframework.data.neo4j.repository.query.filter.PropertyComparisonBuilder reveals the problem. The method canIgnoreCase is called it looks like this:

	private boolean canIgnoreCase(Part part) {
		return part.getType() == SIMPLE_PROPERTY && String.class.equals(part.getProperty().getLeafType());
	}

It seems that the use of IgnoreCase (part.getType()) is only allowed for SIMPLE_PROPERTY but no for all others like CONTAINING.

The question is: How could i get a working findByContainingIgnoreCase method, preferable without using cypher (i am using spring data to abstract from these details).

My OGM calsses are these:

@RelationshipEntity(type = "responsible_for_product")
@Data
public class ProductResponsibleUnitRelation {

    @Id
    @GeneratedValue
    private Long id;


    @StartNode
    private LegalEntityNode legalEntity;

    @EndNode
    private ProductHierarchyNode productHierarchy;

    private LocalDate validFrom;

    private LocalDate validTo;

}
@NodeEntity
@Data
public class ProductHierarchyNode {
    @Id
    private String id;

}

I want to find all relations by case insensitive parts ("containing") of the id.


(Gerrit Meier) #2

This will be part of the Spring Data Neo4j Moore release. The ticket is already solved https://jira.spring.io/browse/DATAGRAPH-1190


(Moritz Loeser) #3

Thanks for quick reply,

is there a plan when 5.2 M2 (Moore) is available?
Is there any workaround available?


(Gerrit Meier) #4

The Spring Data releases are managed by Pivotal and Moore M2 is currently scheduled for March 7th (https://spring-calendar.cfapps.io/).

You could go with a regex e.g. findByNameRegex(String regex). Have a look at the test/example https://github.com/spring-projects/spring-data-neo4j/blob/e4450fdd9866ca7451f1cb8bee375cec532dcdf2/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/examples/restaurants/RestaurantTests.java#L500


(Moritz Loeser) #5

Just: Thank You :slight_smile: