Hibernate搜索StringBridge ClassCastException

时间:2015-09-14 13:47:26

标签: java hibernate search hibernate-search

当我尝试在项目中使用StringBridge时,我发现objectToString(Object obj)方法至少被调用了两次。一次使用Object将映射到String,第二次使用生成的String,这会导致ClassCastException。

public class SchluessellisteBridge implements StringBridge {

    @Override
    public String objectToString(Object obj) {
        if (obj == null) {
            return "";
        }
        Schluesselliste schluesselliste = (Schluesselliste) obj;
        return schluesselliste.getLangname();
    }

}


@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "rv_entscheidungArt_id")
@Field
@FieldBridge(impl = SchluessellisteBridge.class)
protected Rechtsvorgang entscheidungArt;

即使我使用@DateBridge,我也会遇到这种行为

@Field(analyze = Analyze.NO)
@DateBridge(resolution = Resolution.DAY)
@Temporal(TemporalType.DATE)

我是否误解了StringBridge的目的????

我正在使用Hibernate Search 5.3和Hibernate 4.3

        <property name="hibernate.search.default.directory_provider"
            value="filesystem" />
        <property name="hibernate.search.default.indexBase" value="/var/lucene/indexes" />

我的实体是JPA实体。为了搜索,我使用Hibernate API,如

List<Gesamtentscheidung> gesamtentscheidungen = null;
EntityManager em = PersistenceService.getInstance().getEntityManagerFactory().createEntityManager();
Session session = em.unwrap(Session.class);

FullTextSession fullTextSession = Search.getFullTextSession(session);


fullTextSession.beginTransaction();


QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Gesamtentscheidung.class).get();


org.apache.lucene.search.Query luceneQuery = queryBuilder
        .keyword()
        .onFields("betreff", "tatbestaende.aktenzeichen", "entscheidungArt")
        .matching(searchString)
        .createQuery();
org.hibernate.Query hibernateQuery = fullTextSession.createFullTextQuery(luceneQuery, Gesamtentscheidung.class);


gesamtentscheidungen = hibernateQuery.list();

fullTextSession.getTransaction().commit();

em.close();
return gesamtentscheidungen;

1 个答案:

答案 0 :(得分:0)

Schluesselliste schluesselliste = (Schluesselliste) obj;

在上面的行中存在问题,因为将为ObjectToString和StringToObject调用此方法,因此最好在转换之前通过instanceof处理对象。或者你可以探索twowayfieldbridge