sql - tables - hql subquery
Búsqueda insensible a mayúsculas/minúsculas con Hibernate (8)
Estoy usando Hibernate para ORM de mi aplicación Java en una base de datos Oracle (no es que el proveedor de la base de datos importe, podemos cambiar a otra base de datos un día), y quiero recuperar objetos de la base de datos de acuerdo con las cadenas proporcionadas por el usuario. Por ejemplo, cuando busco personas, si el usuario está buscando personas que vivan en ''fran'', quiero poder darle a su gente en San Francisco.
SQL no es mi fuerte, y prefiero el código de construcción de Criteria
de Hibernate para las cadenas codificadas. ¿Puede alguien señalarme en la dirección correcta sobre cómo hacer esto en el código, y si es imposible, cómo debería ser el SQL codificado?
Gracias,
Yuval = 8-)
El enfoque habitual para ignorar el caso es convertir tanto los valores de la base de datos como el valor de entrada en mayúscula o minúscula; el sql resultante tendría algo así como
select f.name from f where TO_UPPER(f.name) like ''%FRAN%''
En restricciones de criterios de hibernación. Como (...). IgnorarCase ()
Estoy más familiarizado con Nhibernate por lo que la sintaxis podría no ser 100% precisa
para obtener más información, consulte pro hibernate 3 extract e hibernate docs 15.2. Estrechando el conjunto de resultados
Esto también se puede hacer utilizando el criterio Ejemplo, en el paquete 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 otra forma que considero útil para lograr lo anterior.
La mayoría de las intercalaciones de bases de datos predeterminadas no distinguen entre mayúsculas y minúsculas, pero en el mundo de SQL Server se puede configurar en la instancia, la base de datos y el nivel de columna.
Para el caso simple que describes, mira Restrictions.ilike (), que hace una búsqueda insensible a mayúsculas y minúsculas.
Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike(''town'', ''%fran%'');
List results = crit.list();
Podrías mirar usando Compass un envoltorio sobre lucene.
http://www.compass-project.org/
Al agregar algunas anotaciones a los objetos de tu dominio obtienes este tipo de cosas.
Compass proporciona una API simple para trabajar con Lucene. Si sabe cómo usar un ORM, entonces se sentirá como en casa con Compass con operaciones simples para guardar, y eliminar y consultar.
Desde el sitio en sí. "Sobre la base de Lucene, Compass simplifica los patrones de uso común de Lucene, como la búsqueda al estilo de Google, las actualizaciones de índices y otros conceptos más avanzados como el almacenamiento en caché y la indexación (subíndices). Compass también utiliza optimizaciones incorporadas para confirmaciones concurrentes y se fusiona ".
Lo he usado en el pasado y lo encuentro genial.
Si utiliza la HibernateTemplate de Spring para interactuar con Hibernate, aquí le mostramos cómo haría una búsqueda insensible a las mayúsculas y minúsculas en la dirección de correo electrónico de un usuario:
getHibernateTemplate().find("from User where upper(email)=?", emailAddr.toUpperCase());
Tampoco tiene que poner los comodines ''%''. Puede pasar MatchMode ( documentos para versiones anteriores aquí ) para indicarle a la búsqueda cómo comportarse. START
, ANYWHERE
, EXACT
y END
son las opciones.
Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike(''town'', ''fran'', MatchMode.ANYWHERE);
List results = crit.list();