2014-07-24 2 views
0

J'essaie d'implémenter une fonction de recherche dans mon application en utilisant la recherche hibernate (lucene). Les recherches simples sur les champs de cordes fonctionnent parfaitement, mais maintenant les choses viennent plus compliquées .... J'espère que vous pouvez me donner quelques conseils ou échantillons.Hibernate Lucene rechercher des collections et des énumérations

je les entités suivantes ...

@Entity 
@Indexed 
public class ChildClass { 

    @Enumerated 
    @Field(index = Index.YES, analyze = Analyze.YES, store = Store.YES) 
    private EnumType enumType; 
    .... 

    //getter setter 

} 

=============================== =========

@Entity 
@Indexed 
public class ParentClass { 

@IndexEmbeded 
List<ChildClass> childs; 

    //getter setter... 

} 

================================== ======

public enum EnumType { 
    a,b,c 
} 

===================================== ==

Maintenant, j'essayer de chercher et trouver par exemple:

« trouver une liste des ParentClasses qui ont Childs où child.enumtype = a »

Je peux le faire avec hql ou des requêtes SQL natives. mais comment le faire avec des requêtes hibernate lucene.

Merci à l'avance

+0

pour clarification: – user2439522

+0

Juste pour clarification pour Cartes par exemple \t @Field (index = Index.YES, analyse = Analyze.YES, store = Store.NON) @IndexedEmbedded (depth = 1) private Carte commentaires; \t je peux utiliser une requête comme: luceneQuery = queryBuilder.keyword() générique() Onfield ("commentaires") de correspondance ( searchString) .createQuery();... booleanJunction.should (luceneQuery); \t \t \t ce qurey renvoie les résultats comme prévu. J'ai un problème avec le cas d'utilisation décrit ci-dessus – user2439522

Répondre

0

Votre utilisation de @IndexedEmbedded ne s'applique à ce cas - il me semble que votre classe enfant est une entité, comme d'habitude dans les entités de l'enfant, ils se réfèrent à leurs parents, de sorte que la classe parente a une cartographie bidirectionnelle pour leurs enfants.

Comme indiqué here (Address étant l'exemple de cas d'utilisation)

Pour vous assurer que le document Lieu Lucene est mis à jour lorsque son adresse modifications, vous devez marquer l'autre côté de la bidirectionnelle relation avec @ Contenu dans. @ContainedIn n'est utile que sur les associations pointant vers des entités comme par opposition aux objets incorporés (collection de).

Peut-être que vous pourriez essayer l'annotation @ContainedIn sur votre liste child.

En résumé:

  • vous pouvez utiliser @IndexedEmbedded Child-Parent (sur la propriété des parents)
  • vous pouvez utiliser @ContainedIn Parent-Collection<Child> (bidirectionnel)
+0

Merci pour la réponse, je comprends jusqu'à présent, mais comment devrait ressembler luceneQurery pour le szenario ci-dessus, comme vous pouvez le voir, j'ai déjà essayé @IndexEmbedded – user2439522

Questions connexes