neo4j / neo4j-ogm

Java Object-Graph Mapping Library for Neo4j
https://neo4j.com/docs/ogm-manual/
Apache License 2.0
328 stars 163 forks source link

ogm mapping issue #1156

Open isakovarseniy opened 1 week ago

isakovarseniy commented 1 week ago

Expected Behavior

Current Behavior

Context

Your Environment

I have following structure ( See archive ). During search operation

          1. Insert class Window. 
          2. Collection<?> result = session().loadAll( Canvas.class, filters, sortOrder, pager);

error occurred : Multiple classes found in type hierarchy that map to: [Canvas, UObject, Window] should return class Window. Issue happens in class org.neo4j.ogm.metadata.Metadata method "resolve"

Archive.zip

isakovarseniy commented 1 week ago

I think issue is in MetaData.class

private ClassInfo findSingleImplementor(ClassInfo interfaceInfo) {
    if (interfaceInfo != null && interfaceInfo.directImplementingClasses() != null
        && interfaceInfo.directImplementingClasses().size() == 1) {
        return interfaceInfo.directImplementingClasses().get(0);
    }
    return null;
}

if interface do not have implementation it will return you interface class itself but should return null. Probably should be like this:

private ClassInfo findSingleImplementor(ClassInfo interfaceInfo) {
    if (interfaceInfo != null && interfaceInfo.directImplementingClasses() != null
            && interfaceInfo.directImplementingClasses().size() == 1) {

        if (interfaceInfo.isInterface()) {
            return null;
        } else {
            return interfaceInfo.directImplementingClasses().get(0);
        }
    }
    return null;
}

or interfaceInfo.directImplementingClasses() should be empty