Question

J'utilise Hibernate for ORM de mon application Java pour une base de données Oracle (le fournisseur ne joue pas un rôle important, nous pouvons passer à une autre base de données un jour) et je souhaite récupérer des objets de la base de données conformément aux informations fournies par l'utilisateur. des cordes. Par exemple, lors de la recherche de personnes, si l’utilisateur recherche des personnes qui habitent en «fran», je souhaite pouvoir lui donner le nom de ses habitants à San Francisco.

SQL n'est pas mon atout, et je préfère le code de construction Critères d'Hibernate aux chaînes codées en dur telles quelles. Quelqu'un peut-il m'indiquer comment procéder dans le code et, en cas d'impossibilité, à quoi devrait ressembler le code SQL codé en dur?

Merci,

Yuval = 8 -)

Était-ce utile?

La solution

Pour le cas simple que vous décrivez, consultez Restrictions.ilike (), qui effectue une recherche ne respectant pas la casse.

Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', '%fran%');
List results = crit.list();

Autres conseils

Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', 'fran', MatchMode.ANYWHERE);
List results = crit.list();

Si vous utilisez HibernateTemplate de Spring pour interagir avec Hibernate, voici comment procéder pour effectuer une recherche sans distinction de casse sur l'adresse de messagerie d'un utilisateur:

getHibernateTemplate().find("from User where upper(email)=?", emailAddr.toUpperCase());

Vous n’avez pas non plus besoin de mettre les caractères génériques '%'. Vous pouvez transmettre MatchMode (< a href = "http://www.hibernate.org/hib_docs/v3/api/org/hibernate/criterion/MatchMode.html" rel = "nofollow noreferrer"> docs pour les versions précédentes ici ) pour en savoir plus la recherche comment se comporter. Les options START , ANYWHERE , EXACT et END sont les options.

L'approche habituelle pour ignorer les majuscules et les minuscules consiste à convertir à la fois les majuscules et les minuscules des valeurs de la base de données et de la valeur en entrée - le résultat résultant aurait quelque chose comme

select f.name from f where TO_UPPER(f.name) like '%FRAN%'

En mode veille, restrictions.like (...). ignoreCase ()

Je suis plus familier avec Nhibernate, la syntaxe n'est peut-être pas précise à 100%

pour plus d'informations, consultez = X & oi = book_result & resnum = 4 & ct = resultat "rel =" nofollow noreferrer "> extrait de pro hibernate 3 et Documents d'hibernation 15.2. Limiter le jeu de résultats

La plupart des classements de base de données par défaut ne sont pas sensibles à la casse, mais dans le monde SQL Server, ils peuvent être définis au niveau de l'instance, de la base de données et des colonnes.

Vous pouvez utiliser Compass comme un wrapper au-dessus de Lucene.

http://www.compass-project.org/

En ajoutant quelques annotations à vos objets de domaine, vous obtenez ce genre de chose.

Compass fournit une API simple pour travailler avec Lucene. Si vous savez utiliser un ORM, vous vous sentirez comme à la maison avec Compass, avec des opérations simples pour sauvegarder et supprimer & amp; requête.

À partir du site lui-même. "Compassant Lucene, Compass simplifie les modèles d’utilisation courants de Lucene, tels que la recherche dans le style Google, les mises à jour d’index, ainsi que des concepts plus avancés tels que la mise en cache et le partage d’index (sous-index). Compass utilise également des optimisations intégrées pour les validations et les fusions simultanées. "

Je l'ai déjà utilisé par le passé et je le trouve génial.

Ceci peut également être effectué à l'aide du critère Example, dans le package org.hibernate.criterion.

public List findLike(Object entity, MatchMode matchMode) {
    Example example = Example.create(entity);
    example.enableLike(matchMode);
    example.ignoreCase();
    return getSession().createCriteria(entity.getClass()).add(
            example).list();
}

Juste un autre moyen que je trouve utile pour accomplir ce qui précède.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top