大家。
对于一些英语错误感到抱歉。
我正在使用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 :(得分: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。