在我的数据库中,我存储用户输入的电话号码(我想让用户决定如何格式化他们的电话号码)
当用户搜索电话号码时,他们很可能不会按照我可以比较两个字符串的方式格式化数字。甚至“喜欢”也不会这样做,因为这个号码中间可能有括号或其他常用电话分隔符。
我希望能够在应用过滤器并比较结果后,将DB上的每部电话与我的搜索条件进行比较。到目前为止,我想要应用的过滤器就是这个:
private String numberFilter(String num){
num = num.replace("+", "00");
num = num.replace("(", "");
num = num.replace("(", "");
num = num.replace("-", "");
num = num.replace(" ", "");
if (num.contains("ext"))
num = num.substring(0, num.indexOf("ext"));
return num;
}
我正在做的比较电话(仍然没有过滤器)
public List<Entity> getEntityByTelephone(String telephone) {
DetachedCriteria criteria = DetachedCriteria.forClass(Entity.class);
criteria.createAlias("telephones", "tl", CriteriaSpecification.INNER_JOIN);
criteria.add(Restrictions.like("tl.number", telephone));
return (List<Entity>) getHibernateTemplate().findByCriteria(criteria);
}
因此,对于在hibernate中使用上述过滤器作为比较器的方法的帮助将不胜感激
答案 0 :(得分:2)
我不知道如何准确地实现你想要的东西(我对这些表演感到疑惑)实际上,我会以不同的方式实现。
如果你真的想让用户输入他喜欢的电话号码,那么只需存储用户输入,但也一个标准化版本,执行标准化输入的搜索。
对于规范化,我会使用Google's library for dealing with phone numbers,这似乎是完美的工作库。存储PhoneNumber
可能需要实施UserType
,但这不是什么大问题。
答案 1 :(得分:1)
我建议您使用正则表达式来查询存储的数字。我还建议将这些数字存储为标准格式,但我知道您希望保留用户最初提供的格式。
有关在Hibernate中使用不同正则表达式查询的说明see here。
您可能需要使用Restrictions.sqlRestriction()
,因为Hibernate本身不支持Restrictions API中的rlike
运算符。