我正在尝试实现Hibernate全文搜索。用户可以选择哪些字段与搜索相关。这是由JSF中的六个(我的示例)布尔复选框完成的。
六个布尔值意味着2 ^ 6种可能的组合。我需要映射所有这些条件。
示例:
boolean a;
boolean b;
boolean c;
boolean d;
boolean e;
boolean f;
if(a){
// do a search with a
}
..
if(a && b){
// do a search with a and b only
}
..
if(a && b && c){
// do a search with a and b and c only
}
在每个IF语句中,都应该调用一个方法。
基于我的案例的细节示例:
用户想要搜索姓氏和/或名字的用户。
org.apache.lucene.search.Query luceneQuery = qb.keyword()
.onFields("user.surname", "user.givenname")
.matching(searchstring).createQuery();
Conditonally:
QueryBuilder qb = fullTextEntityManager.getSearchFactory()
.buildQueryBuilder().forEntity(BeitragVO.class).get();
if(user){
org.apache.lucene.search.Query luceneQuery = qb.keyword()
.onFields("user.surname", "user.givenname")
.matching(searchstring).createQuery();
}
if(company){
org.apache.lucene.search.Query luceneQuery = qb.keyword()
.onField("company.name")
.matching(searchstring).createQuery();
}
if(student && company){
// How can I add all relevant fields(givenname, surname, and name of
company) to the query?
}
有没有办法更好地做到64 IF?
答案 0 :(得分:5)
你可以像这样编写代码:
String search = "";
if(a){
search += ...
}
..
if(b){
search += ...
}
..
if(c){
search += ...
}
只需通过每个复选框自选择添加任何SQL查询(条件)代码,然后运行它
答案 1 :(得分:2)
我真的很讨厌这个,我经常看到这个,但我想我的观点不够明确,所以我会自己回答我的问题,对不起!
我的一个朋友问我:“你不能使用字段列表,而不是连续传递它们吗?
好吧,我检查了这个,可以给onFields()
一个字符串数组(感谢varargs(...))。
我将所有字段添加到列表中并将它们作为参数传递给我的方法。根据给定的条件,可以添加字段(或不添加字段)。
示例:
List<BeitragVO> results;
List<String> fields= new ArrayList<String>();
FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search
.getFullTextEntityManager(em); // em = entitymanager
QueryBuilder qb = fullTextEntityManager.getSearchFactory()
.buildQueryBuilder().forEntity(BeitragVO.class).get();
if (student) {
fields.add("user.surname");
fields.add("user.givenname");
}
if (company) {
fields.add("company.name");
}
org.apache.lucene.search.Query luceneQuery = qb.keyword()
.onFields(fields.toArray(new String[fields.size()]))
.matching(searchterm).createQuery();
如果公司AND学生属实,则搜索使用所有三个字段。
答案 2 :(得分:1)
Hibernate搜索最好使用条件查询完成。 (查找它们。)在条件查询中,您逐个构造查询。所以,你最终会得到这样的东西:
create criteria query
add non-changing criteria query parts (like where to search, what to retrieve)
if( a ) add criteria query term for a
if( b ) add criteria query term for b
...
execute query
编辑:同样的原则适用于Lucene查询。