Pregunta

Estoy usando Hibernate para el ORM de mi aplicación Java a una base de datos de Oracle (no es que la base de datos del proveedor de la materia, se puede cambiar a otra base de datos de un día), y quiero recuperar objetos de la base de datos de acuerdo a los proporcionados por el usuario con cadenas.Por ejemplo, cuando en la búsqueda de personas, si el usuario está buscando personas que viven en 'fran', quiero ser capaz de dar a su pueblo en San Francisco.

SQL no es mi fuerte, y yo prefiero Hibernate Criteria código de construcción para cadenas codificadas de forma rígida como es.Puede alguien me apunte en la dirección correcta acerca de cómo hacer esto en el código, y si es imposible, ¿cómo la rígida SQL debe parecerse?

Gracias,

Yuval =8-)

¿Fue útil?

Solución

Para el caso sencillo en el que usted describe, mira Restricciones.ilike(), que hace insensibles a mayúsculas / minúsculas de búsqueda.

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

Otros consejos

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

Si utiliza la Primavera del HibernateTemplate para interactuar con Hibernate, aquí es cómo usted podría hacer un caso insensible a la búsqueda de una dirección de correo del usuario:

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

Usted también no tiene que poner en la '%' comodines.Usted puede pasar MatchMode (docs para versiones anteriores aquí) en decirle a la búsqueda de cómo se comportan. START, ANYWHERE, EXACT, y END los partidos son las opciones.

El enfoque habitual para ignorar caso es la de convertir la base de datos de los valores y el valor de la entrada a mayúsculas o minúsculas - la resultante de sql tendría algo como

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

En modo de hibernación criterios de restricciones.como(...).ignoreCase()

Estoy más familiarizado con Nhibernate por lo que la sintaxis puede no ser 100% exacta

para más info ver pro 3 de hibernación de extracto de y hibernate docs 15.2.Estrechamiento del conjunto de resultados

La mayoría de la base de datos predeterminada intercalaciones no son sensibles a las mayúsculas, pero de SQL Server en el mundo que puede ser fijada en la instancia, la base de datos, y el nivel de columna.

Usted puede mirar en el uso de la Brújula de un contenedor por encima de lucene.

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

Mediante la adición de un par de anotaciones a los objetos de dominio se logran este tipo de cosas.

Compass proporciona una API simple para trabajar con Lucene.Si usted sabe cómo usar un ORM, entonces usted se sentirá como en casa con la Brújula con simples operaciones de guardar y eliminar & query.

Desde el sitio en sí."Edificio en la parte superior de Lucene, Brújula simplifica los patrones comunes de uso de Lucene, tales como la búsqueda al estilo de google, las actualizaciones del índice así como los conceptos más avanzados, tales como el almacenamiento en caché y el índice de fragmentación (sub índices).La brújula también utiliza construido en optimizaciones para concurrente se compromete y se funde."

He utilizado esto en el pasado y me parece muy bien.

Esto también puede ser hecho usando el criterio de Ejemplo, en la org.hibernate.criterio de paquete.

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

Sólo otra forma que me parece útil para lograr la anterior.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top