Hibernate Query By Example不按预期工作

时间:2015-07-13 07:54:49

标签: java hibernate criteria

大家。

对于一些英语错误感到抱歉。

我正在使用Vaadin为某些搜索任务构建前端搜索界面。

在前端,我只有一个名为“telefone”的文本字段,它应填充我的实体bean中的三个字段(telefone1,telefone2和telefone3),因为用户提供的电话号码可以在任何“telefone”字段中找到。请参阅以下代码:

@SuppressWarnings("unchecked")
@Override
public List<Fornecedor> executaPesquisaAvancadaDeFornecedores(Fornecedor fornecedor) {
    Map<Integer, Fornecedor> fornecedoresMap = new HashMap<Integer, Fornecedor>();

    if(fornecedor.getTelefone1() != null) fornecedor.setTelefone1("%" + fornecedor.getTelefone1() + "%");
    fornecedor.setTelefone2(fornecedor.getTelefone1());
    fornecedor.setTelefone3(fornecedor.getTelefone1());

    Example exampleFornecedor = Example.create(fornecedor).enableLike(MatchMode.ANYWHERE).ignoreCase();

    Criteria criteria = super.getSession().createCriteria(Fornecedor.class, "fornecedor").add(exampleFornecedor);

    List<Fornecedor> fornecedores = criteria.list();
    for(Fornecedor f : fornecedores) {
        fornecedoresMap.put(f.getId(), f);
    }

    return new ArrayList<Fornecedor>(fornecedoresMap.values());
}

在这种情况下,criteria.list()方法没有提供结果。但如果我删除“telefone2”和“telefone3”设置者,就像这样...

if(fornecedor.getTelefone1() != null) fornecedor.setTelefone1("%" + fornecedor.getTelefone1() + "%");

......标准和QBE正确返回结果,但前提是所提供的电话保存在“telefone1”字段中。

我的问题是为什么会这样? AFAIK,Hibernate Query By Example根据填充的给定搜索字段匹配结果,忽略空属性。

感谢。

1 个答案:

答案 0 :(得分:0)

您正在构建条件(使用s =&#39;%&#39; +输入的搜索字符串+&#39;%&#39;):

(telefone1 LIKE s) AND (telefone2 LIKE s) AND (telefone3 LIKE s)

我想你真的想要

(telefone1 LIKE s) OR (telefone2 LIKE s) OR (telefone3 LIKE s)

如果确实如此,则不能使用始终生成和连接条件的示例查询。尝试使用HQL或标准API。