Domanda

Sto utilizzando Hibernate per ORM della mia app Java su un database Oracle (non che il fornitore del database sia importante, un giorno potremmo passare a un altro database) e desidero recuperare oggetti dal database in base all'utente fornito stringhe. Ad esempio, durante la ricerca di persone, se l'utente è alla ricerca di persone che vivono in "Francia", voglio essere in grado di offrire alla sua gente a San Francisco.

SQL non è il mio punto di forza e preferisco il codice di costruzione Criteria di Hibernate alle stringhe codificate come è. Qualcuno può indicarmi la giusta direzione su come eseguire ciò nel codice e, se impossibile, come dovrebbe apparire l'SQL codificato?

Grazie,

Yuval = Cool

È stato utile?

Soluzione

Per il caso semplice che descrivi, guarda Rest ritenzioni.ilike (), che esegue una ricerca senza distinzione tra maiuscole e minuscole.

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

Altri suggerimenti

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

Se usi Spring's HibernateTemplate per interagire con Hibernate, ecco come farebbe una ricerca senza distinzione tra maiuscole e minuscole sull'indirizzo email di un utente:

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

Inoltre, non è necessario inserire i caratteri jolly '%'. Puoi passare MatchMode (< a href = "http://www.hibernate.org/hib_docs/v3/api/org/hibernate/criterion/MatchMode.html" rel = "nofollow noreferrer"> documenti per le versioni precedenti qui ) da raccontare la ricerca come comportarsi. Le opzioni START , ANYWHERE , EXACT e END sono le opzioni.

Il solito approccio all'ignorare maiuscole / minuscole è convertire sia i valori del database che i valori di input in maiuscolo o minuscolo: il sql risultante avrebbe qualcosa del genere

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

Nei criteri di ibernazione restrizioni.like (...). ignoreCase ()

Conosco meglio Nhibernate, quindi la sintassi potrebbe non essere accurata al 100%

per qualche informazione in più vedi pro hibernate 3 extract e hibernate docs 15.2. Restringere il set di risultati

La maggior parte delle regole di confronto del database predefinite non fa distinzione tra maiuscole e minuscole, ma nel mondo SQL Server può essere impostata a livello di istanza, database e colonna.

Puoi guardare usando Compass un wrapper sopra lucene.

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

Aggiungendo alcune annotazioni agli oggetti del tuo dominio ottieni questo tipo di cose.

Compass fornisce una semplice API per lavorare con Lucene. Se sai come utilizzare un ORM, ti sentirai come a casa con Compass con semplici operazioni per il salvataggio e l'eliminazione di & amp; query.

Dal sito stesso. " Basandosi su Lucene, Compass semplifica i modelli di utilizzo comuni di Lucene come la ricerca in stile google, gli aggiornamenti degli indici e concetti più avanzati come la memorizzazione nella cache e la condivisione degli indici (sottoindici). Compass utilizza anche ottimizzazioni integrate per commit e fusioni simultanei. & Quot;

L'ho usato in passato e lo trovo fantastico.

Questo può essere fatto anche usando il criterio Esempio, nel pacchetto 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();
}

Solo un altro modo che trovo utile per realizzare quanto sopra.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top