0

我正在尝试在休眠中将 FullTextFilters 添加到我的 FullTextQuery 并且只有方法FullTextFilter.setParameter(String name, Object value)

我正在尝试制作一个灵活的通用函数,以根据其搜索的实体向查询添加过滤器,有些有一个参数,有些有两个用于过滤器,所以我想添加一个方法FullTextFilterImplsetParameters(String[] names, String[] value)我可以传入所有参数的名称,可能还有每个参数的值的多维数组,以转换我当前的代码

If( "checking which entity it is"){
  fullTextQuery.enableFullTextFilter("FilterName").setParameter("firstFilter", "val1").setParameter("secondFilter", "val2");
}
else if("this entity's filter only has one parameter"){
     fullTextQuery.enableFullTextFilter("FilterName").setParameter("firstFilter", "val1");
}

我尝试创建 FullTextFilterImpl 的子类并在其中放入一个setParameters函数,但是设置此代码的方式我不确定如何将其用作FullTextQuery.enableFullTextFilter(filterName)返回FullTextFilter对象,然后您调用该setParameter()对象。我不确定我将如何在其中做一个setParameters

编辑:我已经下载了休眠搜索源代码并将以下方法添加到 FullTextFilterImpl 我认为它会做我想要的,但是当我去构建它时(即使只是开箱即用的项目)我得到了所有这些检查样式Only one new line is allowed at the end of a file错误。休眠快速构建指南中是否缺少我的东西。

public FullTextFilter setParameters(Map<String, List<String>> params){
    for (String key : params.keySet()) {
        List<String> values = params.get(key);
        for(int i=0; i< values.size() ; i++){
            parameters.put(key, values.get(i));
        }
    }
    return this;
}
4

3 回答 3

1

如果我正确理解您的问题,您需要Builder 模式

这是您可以使用的示例:

public class FullTextFilter {

    String[] keys;
    Object[] objects;

    private FullTextFilter(String[] keys, Object[] objects) {
    }

    public static FullTextFilterBuilder builder(){
        return new FullTextFilterBuilder();
    }

    public static class FullTextFilterBuilder {

        private Map<String, Object> parameters = new HashMap<String, Object>();

        public FullTextFilterBuilder setParameter(String key, Object value){
            parameters.put(key, value);
            return this;
        }

        public FullTextFilter build(){
            return new FullTextFilter(parameters.keySet().toArray(new String[0]), parameters.values().toArray(new Object[0]));
        }
    }

}

然后像这样使用它:

FullTextFilter filter = FullTextFilter.builder().setParameter("", new Object()).setParameter("", new Object()).build();

告诉你这是否是你要找的。如果不是,我会删除我的答案

于 2013-10-24T18:04:02.690 回答
1

您可以轻松地将属性映射传递给您的自定义过滤器,签名是:

FullTextFilter setParameter(String name, Object value);

所以你可以做

filter.setParameter( "myMap", properties );

其中 properties 是一个哈希图。

关于编译错误信息:

文件末尾只允许有一个新行

是来自 checkstyle 的消息,它验证代码样式是否符合 Hibernate 代码样式。修复很简单:源文件末尾有多个空行,删除它们。错误消息应该告诉您需要抛光哪些文件。

于 2013-10-25T16:57:24.357 回答
0

我想你想要这个:

fullTextQuery.enableFullTextFilter("FilterName").setParameter("firstFilter", "val1").setParameter("secondFilter", "val2");

fullTextQuery{ name:"FilterName" ,parameters:["filter1":"value1", "filter2":"value2"] }

static FullTextQuery enableFullTextFilter(String name){...}
FullTextQuery setParameter(String key, String value){
   parameters.put(key, value);
   return this;
}

假设一个参数hashmap。


看到我有点偏离基地..你不能做这样的事情吗?

setFilters (HashMap<String, String> filters) {
  FullTTextFilter fl = FullTextQuery.enableFullTextFilter("filtername");
  for (String key : filters.keySet()) {
    fl.setParameter(key, filters.get(key));
  }
}
于 2013-10-24T18:09:12.410 回答