0

J'ai des problèmes avec l'héritage et ElasticsearchRepository. Mon code (version courte): Entités:données de printemps elasticsearch héritage aucun résultat sur la requête

public abstract class father{ 
    @Id 
    protected String identifier; 

    // constructors 
    @Field(type= FieldType.String, index = FieldIndex.not_analyzed) 
    public String uri; 
    // getter setter 
} 

/* 
* Stored in elastic search 
*/ 
@Document(indexName = "entity1", type = "entity1") 
public abstract class sonA extends father{ 
    // constructors 
} 

/* 
* Stored in elastic search 
*/ 
@Document(indexName = "entity2", type = "entity2") 
public abstract class sonB extends father{ 
    // constructors 
} 

Repository:

public interface DataBnfRepository extends 
     ElasticsearchRepository<SonA, String> { 

    public SonA findByUri(String uri); 

    @Query("{ \"filtered\":{ \"filter\":{\"term\":{\"uri\":\"?0\"}}}}") 
    public SonA findWithUri(String uri); 
} 

Mes ennuis: Je suis en mesure de mettre les données en recherche élastique mais pas pour les recevoir. Si je fais un repository.findall() cela fonctionne. Si je fais un repository.findWithUri(uri) il ne fonctionne pas (résultat nul) exception Parse pour findByUri

J'ai essayé de chercher exemples: https://github.com/spring-projects/spring-data-elasticsearch/blob/master/src/test/java/org/springframework/data/elasticsearch/entities/SampleInheritedEntity.java Mais il n'y a pas de dépôt. Ce que j'ai trouvé: Si je remplace l'uri par "foo", cela fonctionne. Le problème est donc avec https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#_reserved_characters

donc je l'ai fait un test avec

uri = foo: bar => exception d'analyse syntaxique.

uri = "foo: bar" => exception d'analyse.

uri = foo \: bar => analyser l'exception.

uri = "foo \: bar" => parse exception

Avant hérité j'eu aucun problème avec le code. Je viens de mettre l'URI dans un objet, repository.save(object) et repository.findWithUri(uri), il me donne l'objet.

Toute aide, suggestion ou commentaire est grandement apprécié. S'il vous plaît. Merci beaucoup

Répondre

0

Essayez la méthode suivante.

findByFatherUri(uri); 

Voici comment cela fonctionne pour les entités enfants. Je pense que c'est la même chose pour les classes étendues. Du point de vue de Spring Data, la classe principale est SonA pour DataBnfRepository et son identifiant est celui lié au Repository lorsque vous utilisez la méthode findOne. Vous devez traverser la classe enfant vers le champ que vous essayez d'utiliser pour trouver l'objet. Depuis, je ne suis pas sûr à 100%, laissez-moi savoir si cela fonctionne une fois que vous avez essayé.

+0

Cela ne fonctionne pas (pour l'instant) J'ai l'erreur: Aucune propriété que FatherUri trouvé pour le type SonA. Mais merci pour l'aide, j'attends avec impatience cette solution possible, peut-être il y a un truc pour le faire. –

+0

Okies, désolé. Question rapide cependant, qu'est-ce que 'DataBnfEntity '? et comment cela est-il lié à sonA? Sont-ils les mêmes? Si elles sont identiques, pourquoi l'avez-vous comme classe abstraite? Si 'DataBnfEntity' est parent de sonA, vous devez passer de' DataBnfEntity' à 'Father' comme' findByDataBnfEntitySonAFatherUri (uri) '. – techtabu

+0

Désolé j'ai oublié de le renommer aussi. DataBnfEntity => SonA (Je travaille sur la base de données RDF, mais j'ai filtré les informations) Edité la question, désolé à ce sujet. –