2010-06-23 6 views
1

Dans mon db je stocke les numéros de téléphone des choses comme entrée par l'utilisateur (je veux permettre à l'utilisateur de décider comment il formater leur numéro de téléphone)Rechercher une propriété en veille prolongée après aplying une fonction

lorsque les utilisateurs recherchent un numéro de téléphone, ils ne formateront probablement pas le nombre d'une manière que je peux juste comparer les deux chaînes. Même "comme" ne fera pas l'affaire car peut-être le numéro a des parenthèses ou un autre séparateur de téléphone habituel au milieu. Je veux être capable de comparer chaque téléphone de la base de données avec mes critères de recherche après avoir appliqué un filtre et comparé les résultats. Jusqu'à présent, le filtre que je veux appliquer est celui-ci:

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; 
} 

Et ce que je fais pour comparer les téléphones (il manque toujours le filtre)

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

Ainsi l'aide sur un moyen d'utiliser la filtre ci-dessus comme un comparateur dans hibernate serait apprécié

+0

Peut-être que je pourrais créer mon propre critère d'hibernation? – JorgeO

Répondre

1

Je vous suggère d'utiliser des expressions régulières pour interroger les numéros stockés. Je suggère également que les nombres soient stockés dans un format standard, mais je comprends que vous voulez garder le format que l'utilisateur a fourni à l'origine.

Pour obtenir des instructions sur l'utilisation de différentes requêtes regex avec Hibernate, see here.

Vous devrez probablement utiliser Restrictions.sqlRestriction() car Hibernate ne prend pas en charge l'opérateur rlike nativement dans le Restrictions API.

+0

Jusqu'à présent, j'ai "résolu" le problème en faisant une restriction comme: Restrictions.like ("tl.nombre", "% 4% 1% 2% 2% 5% 7% 1% 0% 7% 8%") Je fais est de filtrer la chaîne puis en supprimant le premier zéro s'il existe et ensuite intercaler un% entre les caractères. Je réalise ce que je veux mais son genre de solution laide. – JorgeO

2

Je ne sais pas comment réaliser exactement ce que vous voulez (et je m'interroge sur les performances) et en fait, je mettrais les choses en œuvre différemment.

Si vous voulez vraiment laisser l'utilisateur d'entrer les numéros de téléphone comme il aime, puis juste stocker l'entrée d'utilisateur, mais aussi une version normalisée et effectuer la recherche sur l'entrée normalisée.

Pour la normalisation, j'utiliserais Google's library for dealing with phone numbers qui semble être la bibliothèque parfaite pour le travail. Stocker un PhoneNumber peut nécessiter l'implémentation d'un UserType mais ce n'est pas grave.

+0

Iteresting bibliothèque ne sais pas si je vais l'utiliser encore puisque les numéros déjà entrés sont terribles la plupart du même pas valide mais c'est ok puisque le PBX répond juste que ce n'était pas un nombre valide. – JorgeO

Questions connexes