如何在相关实体中搜索(Hibernate搜索)

时间:2012-10-12 05:04:39

标签: java hibernate search lucene hibernate-search

我没有尝试这件事。我的要求是按名字搜索记录

以下是我的相关课程:

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来按Record-Name搜索。 但它正在抛出一个例外

  

recordFolderArrival.recordName字段不存在   RecordFolderAnalysis。

我是Hibernate Search的新手,所以如果有人能帮我解决这个问题。 谢谢,不要担心@Entity和其他注释,它们被放置在它们必须的地方我只是没有将它们包含在片段中。

2 个答案:

答案 0 :(得分:6)

好的,我自己找到了答案,我将注释边@IndexEmbedded更改为其他类和@ContainedIn,所以现在我的字段是

@IndexedEmbedded
    private RecordFolderArrival recordFolderArrival;

并且

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

问题已解决,因为@IndexedEmbedded是您可以导航到的属性 你的疑问;我发布了答案,因为它可能对其他人有帮助。

答案 1 :(得分:-2)

我知道QueryBuilders的优点,例如:类型安全。但就个人而言,我仍然觉得它们很糟糕,因为你必须为简单的查询写很多东西,导致代码不易理解。

所以,我更喜欢在你的情况下使用JPQL,它看起来非常像SQL,但处理对象及其属性和关系。使它成为您实体上的NamedQuery并使用参数作为变量值(而不是字符串连接),您应该能够更轻松地解决查询。