2015-07-13 86 views
0

everyone。休眠查詢按示例不按預期方式工作

對不起,有些英文錯誤。

我正在使用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匹配基於填充的給定搜索字段的結果,忽略空屬性。

謝謝。

回答

0

你正在建設一個條件(與S = '%' +輸入的搜索字符串+ '%'):

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

我想,你真的想

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

如果這是真的您不能使用總是產生和連接條件的示例查詢。嘗試使用HQL或標準API。