2012-04-12 19 views
5

Los criterios tienen algunas ventajas sobre el uso de JPQL o SQL sin formato, como se describe en this answer: tipo de seguridad; refactorizar la amabilidad; menos dependencia de las cadenas (pero aún hay algunas). Y una gran desventaja: son menos legibles y simplemente feos. ¿Existe una API de Java (no JPA) para acceder a las bases de datos relacionales que es a la vez segura y legible?Alternativa más utilizable a Criteria API

+3

[Otro sugirió lecturas] (http://stackoverflow.com/q/825141/248082) – nobeh

Respuesta

6

Timo Westkämper ha hecho un buen trabajo con QueryDSL. Esta biblioteca proporciona una DSL para consultar diferentes proveedores de persistencia (JPA, MongoDB, Lucene ...).

Pero a menudo he utilizado soluciones hechas a mano que simplifican las consultas más comunes (enumere una entidad que restringe algunos de sus campos), impidiéndome escribir siempre las mismas líneas. Para las consultas más complejas cambié a la API de criterios ilegible y detallada.

2

MyBatis.

MyBatis es un primer marco para la persistencia clase con soporte para SQL encargo, procedimientos almacenados y proyecciones avanzadas. MyBatis elimina casi todo el código JDBC y la configuración manual de parámetros y la recuperación de resultados. MyBatis puede usar XML simple o anotaciones para primitivas de configuración y mapa, interfaces de mapas y POJOs de Java (objetos antiguos de Java simple) a los registros de la base de datos.

O, como nobeh suggested: jOOQ.

+2

En este sentido, es posible que desee echar un vistazo a [jOOQ] (http://www.jooq.org/) o [JDBI] (http://www.jdbi.org/), también. – nobeh

+0

jOOQ, sí; JDBI, no - JDBI tiene la misma dependencia de cadenas opacas que JPQL. –

0

he encontrado "el último" solución a una búsqueda más fácil APP en la cara de la siguiente clase de utilidad: DynamicQueryBuilder

  1. Da meta modelo, por lo que no se necesita para describir las relaciones usando une .

  2. ¡Busca por plantilla pojo !!! ¡Simplemente ponga los valores en una instancia de entidad y se usarán como criterios!

  3. ¡Utiliza un patrón de generador por lo que es MUY legible!

    Bank bank = new Bank(); bank.setId (12L); bank.setAchCode ("1213"); bank.setCbeCode ("1234"); bank.setStatus (nuevas búsquedas (1L)); bank.setAchShortName ("121");

    Lista ids = new ArrayList(); ids.add (1); ids.add (2); ids.add (3); ids.add (4); ids.add (5);

    Lista cbeCodes = new ArrayList(); cbeCodes.add ("1111"); cbeCodes.add ("2222");

    DynamicQueryBuilder queryDyncBuilder1 = nuevo DynamicQueryBuilder.Builder (nulo) .select (banco) .withOperType (Operator.OperType.AND). withAdvancedParam ("cbeCode", como, PERCENT_AROUND) .withAdvancedParam ("id", IN, ids) .withAdvancedParam ("achCode", ENTRE, cbeCodes) .withAdvancedParam ("achShortName", GT) .orderBy ("id") .orderBy ("cbeCode", true) .orderBy ("status.code", true) .build();

    System.out.println (queryDyncBuilder1.getQueryString());

Si ejecuta la llamada por encima del componente construirá el siguiente resultado JPQL consulta:

SELECT b 
FROM Bank b 
WHERE b.status = :status 
AND b.cbeCode LIKE :cbeCode 
AND b.achShortName > :achShortName 
AND b.id IN :id 
AND (b.achCode BETWEEN :achCodeFrom AND :achCodeTo) 
ORDER BY b.status.code DESC, b.id ASC, b.cbeCode DESC 
+0

"Utiliza un patrón de compilador por lo que es MUY legible" Me gusta QueryDSL bastante más a este respecto. –

Cuestiones relacionadas