如何根据条件在多个字段中实现搜索

时间:2015-02-15 11:44:41

标签: java hibernate if-statement conditional-statements hibernate-criteria

我正在尝试实现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?

3 个答案:

答案 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查询。