简体   繁体   English

Hibernate Query by Example无法正常工作

[英]Hibernate Query By Example not working as expected

everyone. 大家。

Sorry for some english mistakes. 对不起,有些英语错误。

I am using Vaadin to build a front-end search interface for some search tasks. 我正在使用Vaadin为某些搜索任务构建前端搜索界面。

In front-end I have only one text field called "telefone" that should fill three fields in my entity bean (telefone1, telefone2 and telefone3), because the telephone number provided by user can be found in any "telefone" field. 在前端,我只有一个文本字段“ telefone”,该文本字段应该填充我的实体bean中的三个字段(telefone1,telefone2和telefone3),因为用户提供的电话号码可以在任何“ telefone”字段中找到。 See the code below: 请参见下面的代码:

@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());
}

In this case, there is no result provided by criteria.list() method. 在这种情况下,criteria.list()方法没有提供结果。 But if I remove "telefone2" and "telefone3" setters, like this... 但是,如果我删除“ telefone2”和“ telefone3”设置器,就像这样...

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

... the criteria and the QBE returns the result correctly, but only if the telephone provided is saved in "telefone1" field. ...条件和QBE正确返回结果,但前提是所提供的电话保存在“ telefone1”字段中。

My question is why this occurs? 我的问题是为什么会这样? AFAIK, Hibernate Query By Example matches the results based on the given search fields filled, ignoring null attributes. AFAIK,示例休眠查询根据填充的给定搜索字段匹配结果,忽略空属性。

Thanks. 谢谢。

You are building a condition (with s = '%' + entered search string + '%'): 您正在建立条件(使用s ='%'+输入的搜索字符串+'%'):

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

I guess that you really want 我想你真的想要

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

If that is true you can't use query by example which always produces and-connected conditions. 如果是这样,则不能使用总是产生和连接条件的示例查询。 Try to use HQL or the criteria API instead. 尝试改用HQL或标准API。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM