2017-04-12 18 views
0

私は冬眠lucene検索を行っています。ドメインobject.Butを取得することで正常に動作しています。私の要件はprojections.ItはOneToManyに関連するfieldsだけです。 @IndexedEmbeddedフィールドの値を投影することをお勧めします。 Hibernate Search documentationで述べたように、次のスニペットは私のコードhibernate luceneで投影を使用する方法

@Indexed(index="Skills") 
       @AnalyzerDef(name = "skillAnalyzer", 
       tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class), 
       filters = { 
        @TokenFilterDef(factory = LowerCaseFilterFactory.class), 
        @TokenFilterDef(factory = SnowballPorterFilterFactory.class, params = { 
        @Parameter(name = "language", value = "English") 
        }) 
       }) 
       @Entity 
       @Table(name = "skills") 
       public class Skills { 
        @Id 
        @GeneratedValue(strategy = GenerationType.AUTO) 
        @Column(name = "skill_id") 
        @Field(name="skillIdPk",index=Index.YES, analyze=Analyze.YES, store=Store.YES) 
        private int skillId; 

        @Field(index=Index.YES, analyze=Analyze.YES, store=Store.YES) 
        @Column(name = "skill") 
        private String skill; 

        @Column(name = "skill_type") 
        private String skillType = "default"; 

        //setters & getters 
       } 


      @Indexed(index = "JobSeeker") 
      @AnalyzerDef(name = "jobSeekerAnalyzer", tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class), filters = { 
        @TokenFilterDef(factory = LowerCaseFilterFactory.class), 
        @TokenFilterDef(factory = SnowballPorterFilterFactory.class, params = { 
          @Parameter(name = "language", value = "English") }) }) 
      @Entity 
      @Table(name = "jobseeker") 
      @Component 
      public class JobSeeker { 
       @Id 
       @GeneratedValue(strategy = GenerationType.AUTO) 
       @Column(name = "jobseeker_id") 
       private long jobSeekerId; 

       @Column(name = "email_id", unique = true) 
       private String emailId; 

       @Column(name = "first_name") 
       private String firstName; 

       @Column(name = "middle_name") 
       private String middleName; 

       @Column(name = "last_name") 
       private String lastName; 

       @Column(name = "password") 
       private String password; 


       @IndexedEmbedded 
       private Set<JobSeekerSkills> jobSeekerSkills = new HashSet<JobSeekerSkills>(); 
      //setters & getters 


      } 


     @Indexed(index="JobSeekerSkills") 
     @AnalyzerDef(name = "jobseekerSkillAnalyzer", 
     tokenizer = @TokenizerDef(factory=StandardTokenizerFactory.class), 
     filters = { 
      @TokenFilterDef(factory = LowerCaseFilterFactory.class), 
      @TokenFilterDef(factory = SnowballPorterFilterFactory.class, params = { 
      @Parameter(name = "language", value = "English") 
      }) 
     }) 
     @Entity 
     @Table(name="jobseeker_skills") 

     public class JobSeekerSkills 
     { 
      @Id 
      @GeneratedValue(strategy=GenerationType.AUTO) 
      @Column(name="jobseeker_skill_id") 
      private long jobSeekerSkillId; 

      @ManyToOne 
      @JoinColumn(name="jobseeker_jobseeker_id") 
      private JobSeeker jobSeeker; 

      @ManyToOne 
      @JoinColumn(name="skills_skill_id") 
      @IndexedEmbedded 
       private Skills skills; 


     //setters & getters 

     } 

//======================================================================= 
//This is my Dao code 
FullTextSession fullTextSession = Search.getFullTextSession(session); 
     fullTextSession.createIndexer().startAndWait(); 
     QueryBuilder qb = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(JobSeeker.class).get(); 
     Query query = null; 
     for (String string : skills) { 
      query = qb.keyword().onField("jobSeekerSkills.skills.skillIdPk").matching(Integer.parseInt(string)).createQuery(); 
     } 
     org.hibernate.search.FullTextQuery query1 = 
       fullTextSession.createFullTextQuery(query, JobSeeker.class); 
      query1.setProjection("jobSeekerId", "jobSeekerSkills.skills.skill"); 
      List results = query1.list(); 
      for (int i = 0; i < results.size(); i++) { 
       Object[] object = (Object[]) results.get(i); 
       System.out.println(object[0]); 
       System.out.println(object[1]); 
      } 
     // List<Skills> authorName1 = (List<Skills>) firstResult[1]; 
     // System.out.println(authorName1); 
     return results; 

答えて

2

です:

投影は、あなたのケースでそう@IndexedEmbedded

を経由してインデックス化されているコレクションやマップ

上では動作しません。 、@IndexedEmbeddedによってインデックスされたjobSeekerSkillsのコレクションであるjobSeekerSkills.skills.skillに投影しようとすると、それは良い考えではありません。

数値フィールドでキーワードクエリを実行しているだけなので、Hibernate ORMを使って古典的なJQPL/SQLクエリを実行するほうがよいでしょう。

とにかく何らかの理由で本当に Hibernateを使用したい場合は、クエリを使用して、コレクションに投影する必要はありません。代わりに、ちょうどJobSeekerSkillsjobSeekerプロパティに@IndexedEmbedded(includePaths = "includePaths")を追加し、エンティティJobSeekerSkillsのインデックスを対象とするクエリを手直し:

FullTextSession fullTextSession = Search.getFullTextSession(session); 
    fullTextSession.createIndexer().startAndWait(); 
    QueryBuilder qb = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(JobSeeker.class).get(); 
    Query query = null; 
    for (String string : skills) { 
     query = qb.keyword().onField("skills.skillIdPk").matching(Integer.parseInt(string)).createQuery(); 
    } 
    org.hibernate.search.FullTextQuery query1 = 
      fullTextSession.createFullTextQuery(query, JobSeeker.class); 
     query1.setProjection("jobSeeker.jobSeekerId", "skills.skill"); 
     List results = query1.list(); 
     for (int i = 0; i < results.size(); i++) { 
      Object[] object = (Object[]) results.get(i); 
      System.out.println(object[0]); 
      System.out.println(object[1]); 
     } 
    // List<Skills> authorName1 = (List<Skills>) firstResult[1]; 
    // System.out.println(authorName1); 
    return results; 

注:すでに@IndexedEmbeddedを持っているので、新しい@IndexedEmbeddedincludePathsが必要なだけです協会の裏側(JobSeeker.jobSeekerSkills)。無限の再帰を回避します(JobSeeker.jobSeekerSkills.jobSeeker.jobSeekerSkills.jobSeeker.jobSeekerSkills ...)。 @IndexedEmbeddedJobSeeker.jobSeekerSkillsに削除すると、@IndexedEmbeddedincludePathsも削除できます。

+0

私は郵便で言及したのと同じエラーが出ています。私は就職者にはすべてのスキルを取得せず、各就職先に対して単一のスキルしか与えません。複数のスキルに関連付けられていても、onetotooneのような単一のレコードを与えています.Hibernateのルーゼン投影を使用してIndexembeddedエンティティのすべての値を取得する方法はありますか? –

+0

いいえ、求職者IDとフルテキストクエリの結果のスキルのコレクションを含むタプルのリストを持つことはできません。あなたが得ることができる最高のものは、求職者IDとそのスキルの1つを含むタプルのリストです。それから、求職者IDでスキルをグループ化するためにプロセスをポストする必要があります。上記のように、それがあなたが望むものでない場合は、単純なJPQL/HQLクエリを使用することをお勧めします。この特定のケースでは、フルテキスト検索は不要です。 –

関連する問題