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<>();

  }

次は私の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として設定して、Record-Nameで検索しています。しかし、それは例外を投げています

recordFolderArrival.recordNameフィールドはRecordFolderAnalysisに存在しません。

私はHibernateSearchに非常に慣れていないので、誰かが私がこのことを解決するのを手伝ってくれるなら。ありがとう、@ Entityやその他のアノテーションについて心配する必要はありません。スニペットに含めていないので、必要な場所に配置されます。

4

2 に答える 2

5

わかりました自分で答えを見つけました。注釈側@IndexEmbeddedを他のクラスに変更し@ContainedInたので、フィールドは

@IndexedEmbedded
    private RecordFolderArrival recordFolderArrival;

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

@IndexedEmbeddedクエリでナビゲートできるプロパティであるため、問題は解決しました。他の人に役立つかもしれないので、回答を投稿しました。

于 2012-10-12T11:13:53.923 に答える
-2

型の安全性など、QueryBuilders の利点について知っています。しかし、個人的には、単純なクエリに対して多くのことを書かなければならず、コードが理解しにくいものになるため、依然として恐ろしいと思います。

したがって、あなたのケースでは JPQL を使用することをお勧めします。これは SQL によく似ていますが、オブジェクトとその属性と関係を処理します。エンティティで NamedQuery にし、変数値に (文字列連結の代わりに) パラメータを使用すると、クエリをより簡単に解決できるはずです。

于 2012-10-12T08:20:04.267 に答える