2012-10-12 73 views
3

我越來越沒有地方嘗試這個東西。我的要求,搜索是由他們的名字來搜索記錄如何在相關實體(休眠搜索)

以下是我的相關類:

RecordFolderAnalysis.java

@Indexed 
public class RecordFolderAnalysis extends AuditableEntity implements Serializable { 

    @ManyToOne 
    @JoinColumn(name = "arrivalId", nullable = false) 
    @ContainedIn 
    private RecordFolderArrival recordFolderArrival; 

} 

RecordFolderArrival.java

@Indexed 
public class RecordFolderArrival extends BaseEntity implements Serializable 
    { 

    @Column(name="recordName", unique = true, nullable = false) 
    @Field(index = Index.UN_TOKENIZED) 
    private String recordName; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "recordFolderArrival", fetch = FetchType.LAZY, targetEntity = RecordFolderAnalysis.class) 
    @IndexedEmbedded 
    private List<RecordFolderAnalysis> recordFolderAnalysis=new ArrayList<>(); 

    } 

Follwing是我的DAO類方法:

@Override 
    public List<T> search(final String queryString, final String... fields) { 
     List searchResult = hibernateTemplate.executeFind(new HibernateCallback<Object>() { 
      org.hibernate.Query fullTextQuery1 = null; 

      @Override 
      public Object doInHibernate(Session session) throws HibernateException, SQLException { 
       try { 
        System.out.println("in do in hibernate"); 
        FullTextSession fullTextSession = Search.getFullTextSession(session); 
        Transaction tx = fullTextSession.beginTransaction(); 
        QueryBuilder builder=fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(persistentClass).get(); 
        Query luceneQuery=builder.keyword().onField("recordFolderArrival.recordName").matching(queryString).createQuery(); 
        fullTextQuery1 = fullTextSession.createFullTextQuery(luceneQuery); 


        for (Object o : fullTextQuery1.list()) { 
         System.out.println("Values" + o); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       return fullTextQuery1.list(); 

      } 
     }); 

     return searchResult; 
    } 

所以我在尋找的記錄,名稱設置字段名稱爲recordFolderArrival.recordName。 但它拋出一個異常,說

recordFolderArrival.recordName領域一點兒也不在 RecordFolderAnalysis存在。

我對Hibernate Search非常新,所以如果任何人都可以幫我解決這個問題。 感謝和不要擔心@Entity和其他註釋,他們被放置在他們必須是它的只是我沒有把它們包含在片段中。

回答

6

好吧,我發現自己的答案,我改變了註解雙方@IndexEmbedded到其他類和@ContainedIn以及所以現在我的領域是

@IndexedEmbedded 
    private RecordFolderArrival recordFolderArrival; 

而且

@ContainedIn 
    private List<RecordFolderAnalysis> recordFolderAnalysis=new ArrayList<>(); 

問題解決了,因爲@IndexedEmbedded是財產您可以導航到 您的查詢;我發佈了答案,可能對其他人有幫助。

-2

我知道QueryBuilders的優點,類型安全。但個人而言,我仍然覺得它們很可怕,因爲你必須編寫大量的簡單查詢,導致代碼不易理解。

所以,我寧願在你的情況下使用JPQL,它看起來非常像SQL,但處理對象及其屬性和關係。將它作爲你實體上的NamedQuery併爲變量值(而不是字符串連接)使用參數,你應該能夠更容易地解決你的查詢。

+0

我知道我可以通過簡單的NamedQuery做到這一點,但我想通過全文搜索(Hibernate Search)進行搜索。 –

+0

好的,對不起,我錯過了那一點。 –