应用函数后在Hibernate中搜索属性

时间:2010-06-23 01:31:25

标签: java hibernate search orm detachedcriteria

在我的数据库中,我存储用户输入的电话号码(我想让用户决定如何格式化他们的电话号码)

当用户搜索电话号码时,他们很可能不会按照我可以比较两个字符串的方式格式化数字。甚至“喜欢”也不会这样做,因为这个号码中间可能有括号或其他常用电话分隔符。

我希望能够在应用过滤器并比较结果后,将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中使用上述过滤器作为比较器的方法的帮助将不胜感激

2 个答案:

答案 0 :(得分:2)

我不知道如何准确地实现你想要的东西(我对这些表演感到疑惑)实际上,我会以不同的方式实现。

如果你真的想让用户输入他喜欢的电话号码,那么只需存储用户输入,但一个标准化版本,执行标准化输入的搜索

对于规范化,我会使用Google's library for dealing with phone numbers,这似乎是完美的工作库。存储PhoneNumber可能需要实施UserType,但这不是什么大问题。

答案 1 :(得分:1)

我建议您使用正则表达式来查询存储的数字。我还建议将这些数字存储为标准格式,但我知道您希望保留用户最初提供的格式。

有关在Hibernate中使用不同正则表达式查询的说明see here

您可能需要使用Restrictions.sqlRestriction(),因为Hibernate本身不支持Restrictions API中的rlike运算符。