2009-07-15 8 views
2

Ich versuche, JPA mit HibernateSearch zu verwenden. Ich habe Beispiel 5.3 in http://docs.jboss.org/hibernate/stable/search/reference/en/html/search-query.html verwendet. Die Ergebnisse zeigen sich wie erwartet.JPA HibernateSearch-Projektionen

Die zurückkommenden Daten sind jedoch ein riesiger Graph. Ich brauche nur den Primärschlüssel der Daten. Also habe ich Beispiel 5.9 ausprobiert, aber es zeigt nur die Hibernate API. Es gab keine javax.persistence.Query.setProjection() Methode.

Was kann ich verwenden, um nur den Primärschlüssel eines Suchergebnisses zu erhalten? Sollte ich versuchen, den Ruhezustand session von der EntityManager in JPA zu bekommen?

Danke für jede Hilfe.

Antwort

2

Beispiel 5.3 war ein bisschen irreführend. javax.persistence.Query muss nicht verwendet werden. Stattdessen hat org.hibernate.search.jpa.FullTextQuery die setProjection() Methode, die ich brauchte. Hier ist der resultierende Code (mit vollständig qualifizierten Klassennamen):


     //Open JPA session 
     javax.persistence.EntityManagerFactory emf=javax.persistence.Persistence.createEntityManagerFactory("manager1"); 
     javax.persistence.EntityManager em=emf.createEntityManager(); 
     em.getTransaction().begin(); 

     //Make a FullText EM from the JPA session. 
     org.hibernate.search.jpa.FullTextEntityManager fullTextSession=org.hibernate.search.jpa.Search.getFullTextEntityManager(em); 

     //Build the lucene query. 
     org.apache.lucene.queryParser.QueryParser parser=new org.apache.lucene.queryParser.QueryParser("data1",new org.apache.lucene.analysis.standard.StandardAnalyzer()); 
     org.apache.lucene.search.Query query=parser.parse("FindMe"); 

     //Convert to a hibernate query. 
     org.hibernate.search.jpa.FullTextQuery query2=fullTextSession.createFullTextQuery(query, SampleBean.class); 

     //Set the projections 
     query2.setProjection("id"); 

     //Run the query. 
     for (Object[] row:(List)query2.getResultList()){ 
      //Show the list of id's 
      System.out.println(row[0]); 
     } 

     //Close 
     em.getTransaction().commit(); 
     em.close(); 
     emf.close(); 
 

query2 funktioniert die Projektion und alles ist gut!