webentwicklung-frage-antwort-db.com.de

Suche ohne Berücksichtigung der Groß- / Kleinschreibung mit Ruhezustand

Ich verwende Hibernate für ORM von meiner Java App zu einer Oracle-Datenbank (nicht, dass der Datenbankanbieter wichtig ist, wir wechseln möglicherweise eines Tages zu einer anderen Datenbank), und ich möchte Objekte von der abrufen datenbank nach vom benutzer angegebenen strings Wenn der benutzer zum beispiel nach menschen sucht, die in 'fran' leben, möchte ich ihren menschen in san francisco geben können.

SQL ist nicht meine Stärke, und ich ziehe Hibernates Criteria -Erstellungscode fest codierten Zeichenfolgen vor. Kann mir jemand einen Hinweis geben, wie dies im Code zu tun ist, und wenn dies unmöglich ist, wie das fest codierte SQL aussehen sollte?

Vielen Dank,

Yuval = 8-)

48
Yuval

Sehen Sie sich für den von Ihnen beschriebenen einfachen Fall Restrictions.ilike () an, bei dem nach Groß- und Kleinschreibung gesucht wird.

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

Wenn Sie Spring's HibernateTemplate verwenden, um mit Hibernate zu interagieren, gehen Sie wie folgt vor, um eine Suche nach der E-Mail-Adresse eines Benutzers durchzuführen, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird:

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

Der übliche Ansatz, Groß- und Kleinschreibung zu ignorieren, besteht darin, sowohl die Datenbankwerte als auch den Eingabewert in Groß- oder Kleinschreibung umzuwandeln - die resultierende SQL würde ungefähr so ​​aussehen

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

Einschränkungen im Ruhezustand wie (...). IgnoreCase ()

Ich kenne Nhibernate besser, daher ist die Syntax möglicherweise nicht zu 100% korrekt

weitere Informationen finden Sie unter Pro-Hibernate-3-Extrakt und Hibernate-Dokumente 15.2. Einschränken der Ergebnismenge

4
Richard

Sie müssen auch nicht die Platzhalter '%' eingeben. Sie können MatchMode ( Dokumente für frühere Versionen hier ) übergeben, um der Suche mitzuteilen, wie sie sich verhalten soll. START, ANYWHERE, EXACT und END Übereinstimmungen sind die Optionen.

4
Arthur Thomas

Bei den meisten Standard-Datenbankkollatierungen wird die Groß- und Kleinschreibung nicht berücksichtigt. In der SQL Server-Welt kann sie jedoch auf Instanz-, Datenbank- und Spaltenebene festgelegt werden.

0
Cade Roux

Sie könnten sich mit Compass einen Wrapper über Lucene ansehen.

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

Indem Sie Ihren Domain-Objekten einige Anmerkungen hinzufügen, erreichen Sie so etwas.

Compass bietet eine einfache API für die Arbeit mit Lucene. Wenn Sie wissen, wie man ein ORM verwendet, werden Sie sich bei Compass mit einfachen Operationen zum Speichern und Löschen und Abfragen wie zu Hause fühlen.

Von der Website selbst. "Compass baut auf Lucene auf und vereinfacht gängige Verwendungsmuster von Lucene wie die Suche im Google-Stil, Indexaktualisierungen sowie erweiterte Konzepte wie Caching und Index-Sharding (Unterindizes). Compass verwendet auch integrierte Optimierungen für gleichzeitige Commits und verschmilzt. "

Ich habe das in der Vergangenheit benutzt und finde es großartig.

0
Paul Whelan

Dies kann auch mit dem Kriterium Example im Paket org.hibernate.criterion erfolgen.

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

Nur ein weiterer Weg, den ich nützlich finde, um das oben Gesagte zu erreichen.

0
Casey