2011-05-21 25 views
5

Como parte de un motor de flujo de trabajo, estoy implementando un paso DB genérico que ejecutaría cualquier consulta SQL determinada y devolvería los resultados como XML. Este flujo de trabajo se puede configurar dinámicamente, por lo tanto, la consulta pasada a la capa de ejecución será una consulta SQL estática completamente calificada, por ejemplo, Buscando una forma de crear SQL dinámico a partir de una consulta SQL determinada en Java

SELECT * FROM USER WHERE USERID = 10
. La desventaja de este enfoque es que la base de datos compila la consulta cada vez que se ejecuta. ¿Hay alguna manera de que pueda crear una consulta SQL dinámica desde la consulta mediante programación? ¿Tiene Java o Hibernate como JPA compatible con dicha función?

+0

La respuesta superior en esta pregunta puede ser lo que está buscando: http://stackoverflow.com/questions/222019/how-to-use-mysql-prepared-statement-caching –

Respuesta

0

En general, necesita parametrizar su entrada a la plantilla de consulta utilizando variables de vinculación. Hay dos formas de variables de vinculación, a saber, i) variables de enlace sin nombre (o variables de enlace posicional); y ii) variables de vinculación nombradas.

Esto se puede hacer vía vainilla JDBC. He encontrado que Spring JDBC es particularmente fácil de maniobrar. Mire específicamente la interfaz JDBCTemplate y sus implementaciones

+0

Puedo parametrizar la consulta si conocer la consulta Tiempo de compilación de la plantilla. En mi caso, obtendría una consulta completa con todas las variables establecidas. ¿Cómo extraigo la plantilla de una consulta completa? Para dibujar una analogía imagine que estoy escribiendo una GUI para una base de datos, el usuario puede ejecutar cualquier consulta al azar, pero la mayoría de las veces se repite la consulta que deja una oportunidad para optimizar. – Kannan

+0

El requisito es cuando obtengo una entrada Consulta "SELECT * FROM USER WHERE USER_ID = 10" Debería poder generar una instrucción preparada "SELECT * FROM USER WHERE USER_ID =?" e identifico que necesito establecer el parámetro en la primera ubicación en 10 de tipo entero. – Kannan

+0

Si es solo un caso como el que mencionaste, utiliza el análisis de Cadenas. Si desea que sea genérico para cualquier consulta, deberá implementar el analizador con su propia gramática SQL. – kuriouscoder

1

Estoy de acuerdo con el usuario kuriouscoder, que debe usar variables de vinculación. Esto funciona con JDBC simple. La mayoría de los RDBMS tienen un caché de cursor, que mantiene tanto las versiones analizadas de la consulta como los planes de ejecución en la memoria, si las consultas son idénticas (es decir, no hay variables en línea). Por lo tanto, la sobrecarga del analizador será mínima.

Por lo que se refiere a la salida XML, puedo recomendar jOOQ (del cual soy el desarrollador). En la próxima versión 1.6.2, agregaré la funcionalidad de exportación para varios formatos (XML, HTML, JSON, CSV). Su consulta se construiría con API fluida de jOOQ y que se vería así:

String xml = create.selectFrom(USER) 
        .where(USERID.equal(10)) 
        .fetch() 
        .formatXML(); 

La salida tendrá este aspecto (y puede ser XSL transformado a cualquier otro formato):

<result> 
    <fields> 
    <field name="USERID"/> 
    <field name="FIRSTNAME"/> 
    <field name="LASTNAME"/> 
    ... 
    </fields> 
    <records> 
    <record> 
     <value field="USERID">1</value> 
     <value field="FIRSTNAME">Lukas</value> 
     <value field="LASTNAME">Eder</value> 
     ... 
    </record> 
    ... 
    </records> 
</result> 

Para obtener más detalles, vea http://www.jooq.org

0

si entiendo lo que está preguntando, entonces debería mirar empiredb http://incubator.apache.org/empire-db/ - es un proyecto bastante pequeño pero, al menos cuando lo estaba usando, era un soporte activo y útil. es como el sqlalchemy de python, ya que le permite construir consultas SQL usando clases y funciones dentro del lenguaje.

citando el enlace:

de tipo seguro, libre de cuerda y API intuitiva. Cree cualquier instrucción SQL, incluida la cláusula de selección, y úsela con cualquier POJO, no solo con los beans de entidad con todas las funciones.

1

Utilicé MyBatis en un proyecto para obtener un comportamiento muy similar. Eche un vistazo a User Guide para obtener información completa.

En MyBatis puedes definir consultas con SQL dinámico; se puede pasar a la SqlMapClient un objeto que contiene las propiedades (por ejemplo, un POJO o un mapa) y usarlas en el texto de la consulta como:

  • # # parámetros (como el?en PreparedStatements)
  • $ variables de $ que se convirtieron directamente porciones de cadena SQL función
  • SQL dinámico para incluir porciones de SQL basada en las propiedades valores

A continuación, el asignador de SQL ejecutará la consulta y devuelve un objeto de Java : si se conoce el registro que regresa de la consulta, puede asignar columnas a un POJO; de lo contrario, en MyBatis puede tener un HashMap como clase resultante y, eventualmente, tratar cada registro con un manejador a través del método queryWithRowHandler() del SqlMapClient para publicar los datos devueltos.

Una vez que tenga al menos una representación HashMap de su consulta, puede transformarla fácilmente en XML.

Cuestiones relacionadas