2012-04-26 13 views
6

En una de mis aplicaciones, debo ejecutar una búsqueda en múltiples campos/columnas. Es una Búsqueda avanzada y hay más de 20 campos con los cuales un usuario puede buscar resultados. Por ejemplo, un usuario puede buscar reservas en base aBúsqueda avanzada Uso de Hibernate Search

  1. Reservas Id
  2. Nombre del pasajero
  3. Pasajero Edad
  4. De Localización
  5. Para Localización
  6. Estado de la reservación
  7. Nombre de la Aerolínea

y 13 de tales campos.

estoy tratando de averiguar si

  1. Hibernate búsqueda pueden y deben ser utilizados aquí? ¿Si es así, cómo? No pude encontrar un ejemplo para una búsqueda tan compleja usando Hibernate Search.

  2. En lugar de la búsqueda Hibernate, simplemente puedo usar Hibernate y quizás diseñar una búsqueda de subprocesos múltiples según el número de parámetros. ¿Sería esa una buena idea?

  3. ¿Es posible utilizar los filtros de Hibernación aquí?

¿Puede alguien proporcionar entradas o enlaces de referencia?

+0

¿Espera que el usuario ingrese sus criterios de búsqueda en un campo y luego lo pruebe en varias columnas? O campos de búsqueda separados para cada columna? –

+0

Sus campos separados para cada columna. –

Respuesta

2

Para este tipo de consultas, generalmente utilizo una consulta Criteria con un objeto de formulario. Luego compruebo null en cada campo de formulario pasado, y si no es null, agrego otro Restriction en la consulta, usando ese campo. El uso de una consulta Criteria mantiene el código Java muy limpio y elimina la concatenación de cadenas desordenadas. Un ejemplo para su caso:

// Form object 
public class bookingSearchForm { 
    private String bookingId; 
    public getBookingId()... 
    public setBookingId()... 
} 

// Hibernate 
Criteria criteria = getSession().createCriteria(Booking.class); 
if(form.getBookingId() != null) { 
    criteria.add(Restrictions.eq("bookingId", form.getBookingId())); 
} 
criteria.list(); 
+0

Hola @ Aaron, gracias por la respuesta. Mi problema es que los datos están distribuidos en aproximadamente 25 tablas. Entonces, si utilizo Criteria, sería una gran declaración con Joins. Esto es algo que quiero evitar para tener una implementación limpia. lo que estás proponiendo funciona perfectamente si tengo, digamos, 5-6 campos para buscar. –

+0

Si tiene las entidades de Hibernate configuradas con relaciones, entonces Hibernate se encargará de todas esas uniones por usted, y podrá usar la estrategia anterior en esas otras tablas. Piense en Hibernate, no en SQL, y deje que la herramienta haga el trabajo por usted. – atrain

+0

No estoy seguro de si te entiendo correctamente. Permítanme darles un ejemplo, voy a buscar "Reservas" donde el "Tipo de viaje" es "unidireccional". El tipo de viaje está incrustado en una clase que está a 6 niveles debajo de la clase 'Reserva'. Entonces, realmente tendría que buscar en el tipo de viaje y no en la clase de reserva. Ahora puede haber 20 de esos parámetros en los que buscaría, que están integrados en varios niveles de la clase Booking. Si tengo que hacer esto usando un Criterio, tendría que unir todas las tablas en estos niveles, lo cual creo que es muy engorroso. –

0

Sí, Hibernate Search va a ser muy útil en tal caso. Puede usar filtros, pero Hibernate Search también tiene filtros.

2

Creo que su decisión debe basarse en el requisito de capacidad. La consulta de hibernación ordinaria puede ser suficiente para buscar en esos muchos campos.

Hibernate Search le ayudará si desea obtener la consulta de búsqueda rápida para una gran cantidad de datos, utilizando el índice inverso. Lo que debe hacer es cargar su base de datos con la capacidad que espera en los próximos 5 años, por ejemplo. Si su consulta habitual de Hibernate se considera aceptable, creo que debería seguir con la consulta de Hibernate habitual.

También puede presentar Hibernate Search en una etapa posterior.

EDIT: Puede optar por no utilizar la Búsqueda de Hibernte, bajar al nivel inferior y utilizar Apache Lucene en su lugar. Puede generar su propio índice Apache Lucene. De esta forma, no tiene que preocuparse por qué campo para buscar registros porque tendrá control total sobre cómo funciona el proceso de tokenización e indexación. Puede almacenar el nombre de fila y columna como parte del resultado de la búsqueda si elige esta opción.

+0

Gracias por su respuesta @Daniel. Mi preocupación aquí es la cantidad de código complejo que debería escribirse para generar la consulta. Estoy buscando entre más de 25 tablas y el número de combinaciones requeridas para escribirse manualmente sería muy propenso a errores. –

+0

¿Preocupación por el código complejo? Baja un nivel a Apache Lucene. No es necesario que cree una consulta de Hibernate, sino que consulte el índice de Lucene que usted mismo creó. El único inconveniente es que necesita comprender la tecnología subyacente de Lucene. –

Cuestiones relacionadas