QueryDSL和Hibernate Search isNull和isNotNull查询

时间:2014-09-17 13:13:10

标签: java lucene spring-data-jpa hibernate-search querydsl

我有一个项目,我打算在hibernate搜索中使用querydsl。 但是我有一个约束阻塞,我不知道如何实现。 我在下面显示的两个类之间有一个oneToMany关系(我省略了所有非相关字段):

联系班级

public class Contact{

    @OneToMany(mappedBy = "contact")
    @OrderBy("startDate DESC")
    @IndexedEmbedded
    private List<AddressTemporal> addressHistory;
}

AddressTemporal class

public class AddressTemporal{


    @NotNull
    @ManyToOne
    @ContainedIn
    private Contact contact;

    @Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO, indexNullAs = Constants.LUCENE_NULL)
    @DateBridge(resolution = Resolution.DAY)
    private Date endDate;

}

我已经使用String常量(“ NULL ”)将lucene配置为索引空字段,以便我可以使用该值查询空字段。

我的问题是我需要执行一个查询,该搜索将在addressHistory集合中进行搜索,但只过滤那些endDate字段为空的查询。 现在

 FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
 fullTextEntityManager.createIndexer().startAndWait();
 QContact c = new QContact("contact");

 SearchQuery<Contact> query = new SearchQuery<> fullTextEntityManager.unwrap(FullTextSession.class), c)
 query.where(c.addressHistory.any().endDate.isNotNull());

但是这不起作用,因为QueryDSL中的搜索查询不支持isNotNull()和isNull()运算符。

我做不了类似的事情:

query.where(c.addressHistory.any().endDate.eq(Constants.LUCENE_NULL));

因为类型安全限制。

最后我的问题是:有没有办法在非String字段上使用QueryDSL和hibernate搜索执行“isNotNull”查询?或者我是否必须使用Lucene查询语法?

谢谢

乌利塞斯

2 个答案:

答案 0 :(得分:0)

我对你的例子感到有点困惑。 SearchQuery 来自何处?您是否正在将Hibernate ORM Criteria查询与Hibernate Search查询混合使用。后者看起来像这样:

QueryBuilder queryBuilder = searchFactory.buildQueryBuilder()
    .forEntity( Contact.class )
    .get();
Query luceneQuery = mythQB.keyword().onField("history").matching("storm").createQuery();

DSL中没有用于搜索空值的特殊方法。您只需在匹配子句中指定空标记值。

或者,您可以使用本机Lucene查询API来构建查询。

答案 1 :(得分:0)

试试这个

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

queryBuilder.keyword().onField(fieldName).ignoreFieldBridge().matching("NULL").createQuery()