Frage

Ich verwende Hibernate für ORM meine Java-Anwendung zu einer Oracle-Datenbank (nicht, dass die Datenbank-Anbieter Fragen können wir in einer anderen Datenbank 1 Tag wechseln), und ich mag Objekte aus der Datenbank abgerufen werden entsprechend vom Benutzer bereitgestellte Saiten. Wenn zum Beispiel für Menschen auf der Suche, wenn der Benutzer für Menschen sucht, die in ‚fran‘ leben, möchte ich in der Lage sein, ihre Leute in San Francisco zu geben.

SQL ist nicht meine starke Seite, und ich ziehe Hibernate Criteria Bauordnung zu hartcodierte Strings, wie sie ist. Kann jemand mich in der richtigen Richtung zeigen, wie diese in dem Code zu tun, und wenn nicht, wie die hartcodierte SQL aussehen sollte?

Danke,

Yuval = 8 -)

War es hilfreich?

Lösung

Für den einfachen Fall, dass Sie beschreiben, schauen Restrictions.ilike (), die einen Groß- und Kleinschreibung Suche der Fall ist.

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

Andere Tipps

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

Wenn Sie Spring HibernateTemplate verwenden mit Hibernate zu kommunizieren, sich hier, wie Sie auf einem Benutzer E-Mail-Adresse ein Groß- und Kleinschreibung Suche tun würde:

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

Sie müssen auch nicht in den ‚%‘ Platzhalter setzen. Sie können passieren MatchMode (< a href = "http://www.hibernate.org/hib_docs/v3/api/org/hibernate/criterion/MatchMode.html" rel = "nofollow noreferrer"> Dokumentation für frühere Versionen hier ) in sagen, die Suche wie sie sich verhalten. START, ANYWHERE, EXACT und END Streichhölzer sind die Optionen.

Der übliche Ansatz Fall zu ignorieren, ist sowohl die Datenbankwerte und den Eingangswert auf Groß- oder Kleinbuchstaben zu umwandeln - die resultierende SQL so etwas wie

haben würde
select f.name from f where TO_UPPER(f.name) like '%FRAN%'

In Hibernate Kriterien restrictions.like (...). IgnoreCase ()

Ich bin mehr vertraut mit Nhibernate so die Syntax nicht zu 100% korrekt sein könnte

für einige weitere Informationen finden Sie unter pro Hibernate 3 Extrakt und Hibernate docs 15.2. Verengen das Ergebnis gesetzt

Die meisten Standard-Datenbank-Sortierungen sind nicht case-sensitive, aber in der SQL Server-Welt kann es an der Instanz festgelegt werden, die Datenbank und die Spalte Ebene.

Sie bei Verwendung von Compass einen Wrapper über lucene aussehen könnten.

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

ein paar Anmerkungen zu Ihrer Domain Durch das Hinzufügen von Objekten Sie erhalten diese Art der Sache erreichen.

Compass bietet eine einfache API für mit Lucene arbeiten. Wenn Sie wissen, wie ein ORM verwenden, dann werden Sie sich wie zu Hause mit Kompass fühlen mit einfachen Operationen zum Speichern und Löschen & Abfrage.

Von der Website selbst. „Aufbauend auf den Gipfel von Lucene, vereinfacht Compass gemeinsame Nutzungsmuster von Lucene wie Google-Stil Suche, Index-Updates sowie fortgeschrittene Konzepte wie Caching und Index sharding (Subindizes). Kompass auch in Optimierungen für die gleichzeitige Commits gebaut verwendet und verschmilzt. "

Ich habe dies in der Vergangenheit verwendet und ich finde es toll.

Dies kann auch mit dem Kriterium Beispiel durchgeführt werden, in dem org.hibernate.criterion Paket.

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

Ein weiterer Weg, die ich finden nützlich, die oben zu erreichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top