2012-09-25 36 views
5

Tenemos una aplicación web Java con un back-end de hibernación que proporciona recursos REST. Ahora nos enfrentamos a la tarea de implementar una búsqueda genérica que está controlada por los parámetros de consulta en nuestra solicitud get:Generar búsqueda SQL desde los parámetros de solicitud HTTP GET

some/rest/resource?name_like=foo&created_on>=2012-09-12&sort_by_asc=something 

o similar.

  • No queremos definir previamente todos los parámetros posibles (nombre, created_on, algo)
  • No quieren tener que analizar la cadena de solicitud para recoger los caracteres de control (como> =)
  • ni nosotros no queremos poner en práctica nuestra propia gramática para reflejar cosas como _eq _like _goe y así sucesivamente (como una alternativa o además de controlar caracteres)

¿existe algún tipo de marco que proporciona Ayuda con esta asignación de los parámetros de solicitud GET a la consulta de la base de datos?

Como sabemos qué recurso REST estamos obteniendo, tenemos la entidad/tabla (seleccionar). Probablemente también sea necesario predefinir las UNIONES que se ejecutarán para limitar las profundidades de una búsqueda.

Pero aparte de eso queremos que el cliente que consume REST pueda ejecutar cualquier búsqueda sin tener que predefinir cómo un determinado parámetro y una determinada secuencia de control se traducirán en una búsqueda.


En este momento estoy tratando algún edificio solución semi automática en Mysemas QueryDSL. Me permite predefinir columnas donde y ordenar columnas y estoy trabajando en una comparación de cadenas simples para detectar cosas como '_like', '_loe', ... en un parámetro y luego activar la parte predefinida correspondiente de la búsqueda. No es muy diferente de una cadena SQL, excepto que es una prueba de inyección SQL y un tipo de guardado.

Sin embargo, todavía tengo que decirle a mi objeto de búsqueda que debería poder manejar una consulta "buscar una persona con un nombre como '???'". En este momento, esto está bien ya que solo consumimos el recurso REST internamente y aislamos la creación de búsqueda real bastante bien. Si necesitamos hacer una búsqueda para hacer más, podemos agregar más predefiniciones por ahora. Pero debemos hacer que nuestros recursos de REST sean públicos en algún momento en el futuro que no serán tan buenos.


Así que nos estamos preguntando, tiene que haber algún marco, mejores prácticas o una solución recomendada para abordar esto. No somos los primeros que quieren esto. Redmine, por ejemplo, ofrece todos sus recursos a través de una interfaz REST y puedo consultar a voluntad. O facebook con su Graph API. Estoy seguro de que esos muchachos no solo predefinieron todas las posibilidades sino que crearon algo de gramática genérica. Nos gustaría ahorrar tanto como sea posible en ese esfuerzo y usar soluciones disponibles en su lugar.

Como he dicho, estamos utilizando Hibernate para que una solución SQL o HQL estaría bien o cualquier cosa que se base en entidades como QueryDsl. (También está el problema de seguridad con respecto a la inyección SQL)

¿Alguna sugerencia? Ideas? ¿Tendremos que hacerlo todo nosotros mismos?

Respuesta

1

Desde una perspectiva .NET, lo más parecido que puedo pensar sería un servicio de datos WCF.

Eche un vistazo a the uri-conventions especificado en el sitio web de OData. Hay buena información en la sección 4.5 Filter System Query Option. Notarás que muchos de los ejemplos en este sitio están relacionados con .NET, pero hay othersuggestions para hacer que esto funcione con Java.

+0

Gracias! Eso suena prometedor Analizaremos esto y veremos si podemos usar partes de él para adaptarlo a nuestra estructura, ya que queremos administrar los recursos REST en sí mismos y solo necesitamos la funcionalidad de consulta. Pero si eso es posible, lo único que necesitaríamos es un mapeo inteligente por parte del consumidor, desde el formulario de búsqueda hasta la estructura de estas consultas. – Pete

+0

Sin problemas. Ha pasado mucho tiempo desde que utilicé Java y/o Hibernate y no estoy seguro de cómo encajaría todo esto con Hibernate. Curiosamente, aunque acabo de [este post] (http://raibledesigns.com/rd/entry/appfuse_news_github_hibernate_search) en el blog de Matt Raible sobre algunos cambios en [AppFuse] (http://appfuse.org/). En la publicación menciona [Hibernate Search] (http://docs.jboss.org/hibernate/search/4.1/reference/en-US/html_single/), y eso me hizo pensar en tu pregunta. Tal vez podrías ver si eso también podría ser útil en tu situación. –

Cuestiones relacionadas