我有一个项目,我打算在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查询语法?
谢谢
乌利塞斯
答案 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()