2009-05-05 8 views
14

Me preguntaba si hay alguna biblioteca que se pueda usar para representar consultas SQL como objetos en Java.¿Hay alguna biblioteca para representar consultas SQL como objetos en código Java?

En el código tengo muchas variables estáticas de tipo java.lang.String que son escritas a mano en consultas SQL. Estaría buscando una biblioteca que tenga un buen fluido API que me permita representar las consultas como objetos en lugar de cadenas.

Ejemplo:

Query q = select("DATE", "QUOTE") 
    .from("STOCKMARKET") 
    .where(eq("CORP", "?")) 
    .orderBy("DATE", DESC); 

Respuesta

7

Jequel parece bastante ingeniosa: http://www.jequel.de/

Utiliza una interfaz fluida, por lo que es fácil de leer, casi como SQL natural (de los documentos):

SqlString sql = select(ARTICLE.OID) 
       .from(ARTICLE, ARTICLE_COLOR) 
       .where(ARTICLE.OID.eq(ARTICLE_COLOR.ARTICLE_OID) 
       .and(ARTICLE.ARTICLE_NO.is_not(NULL))); 

También admite la ejecución de consultas en un DataSource con parámetros, por lo que también se encarga de la creación de consultas parametrizadas.

+0

Se ve bien. Eso es algo que estaba buscando. ¡Aclamaciones! –

+0

¡Agradable! No olvides volver y publicar tus hallazgos. Solo me enteré hace unos días, y no he tenido la oportunidad de usarlo mucho todavía, pero pienso hacerlo en el futuro. – matt

+0

Me había contactado con el desarrollador de Jequel hace un año. Este proyecto parece haber ido en modo de mantenimiento en 2008 ... –

2

Apache Imperio-db es un componente de capa de abstracción de base de datos y la persistencia de datos relacional que permite a los desarrolladores a adoptar un enfoque mucho más SQL centradas en el desarrollo de aplicaciones de mapeo tradicional a objetos relacionales marcos (ORM).

Más aquí: https://empire-db.apache.org/

Quaere

http://xircles.codehaus.org/projects/quaere

+0

¿Está el proyecto activo quaere? Hay muy poco en su sitio web. –

+0

No soy el usuario quaere en general. Solo recuerde que es una de las exageraciones de java-can-have-linq hace años. Desde el archivo de la lista de correos sugieren que el proyecto no es muy activo. FWIW, navegando por la lista de correo, muéstrame algunos proyectos similares que quizás quieras echar un vistazo. JaQu (http://www.h2database.com/html/jaqu.html) La parte inferior de la página también hace referencia a algunos otros proyectos relacionados – Sake

7

http://www.hibernate.org/ Probablemente más potente ORM para Java. Puede hacer mucho más que un simple mapeo de consultas. Entonces puede implementarlo fácilmente en cualquier otro lugar de su aplicación. Para su caso, se puede hacer de alguna manera como que:

public class LookupCodeName 
{ 
    private String code; 
    private String name; 

/*... getter-setters ... */ 
} 

public class someBL { 

public List<LookupCodeName> returnSomeEntity() { 
     SQLQuery sqlQuery = (SQLQuery)((HibernateSession)em).getHibernateSession() 
         .createSQLQuery("SELECT st.name as name, st.code as code FROM someTable st") 
         .addScalar("code") 
         .addScalar("name") 
.setResultTransformer(Transformers.aliasToBean(LookupCodeName.class)); 
    } 
return (List<LookupCodeName>)sqlQuery.list(); 
} 
+0

Sí, conozco Hibernate, pero en su ejemplo todavía hay SQL codificado como una cadena ("SELECT st.name como nombre, st.code como código FROM someTable st"). Tal vez mi pregunta no era lo suficientemente clara, pero quería reemplazar las consultas de cadena con la representación de objetos de esos en lugar de emplear un potente marco para ejecutar consultas. –

+0

Pregzt, es posible que desee consultar los criterios de Hibernate –

+0

. Creo que una API de criterios toma la dirección equivocada al tener una API de generador de SQL. En mi proyecto actual, los desarrolladores originales (y desaparecidos) usaron una API de criterios, y el equipo actual lo odia. Podemos obtener un método DAO usando SQL nativo en la mitad del tiempo que lleva escribir la API de criterios, porque a menudo terminamos viendo el SQL que genera la API de criterios para verificar su corrección. Si ya conoce el SQL correcto, ¿por qué contar con un generador de SQL? – Alan

1

Si no desea asignar consultas de cuerda, entonces debe anotar su clase como entidad y enlazarlo con la tabla a continuación, puede utilizar hibernación o java persistencia. El ejemplo será demasiado complejo. Pero, al final de su consulta se transformará en algo como esto:

lista que ha encontrado de entidades:

Criteria c = createCreteria(entityManager, StockMarket.class); 
    // you can add "where" clause by using c.add(Restrictions); 
    // like this: c.add(Restrictions.ilike("name", "%somename%"); where "name" is your entity's field 
    List<StockMarket> smList = c.list(); 

de búsqueda de objetos por ID:

StockMarket sm = entityManager.find(StockMarket.class, id); 
12

Querydsl admite consultas en SQL, JPA y JDO backends.

El ejemplo anterior se convierte en:

query.from(stockmarket).where(stockmarket.corp.eq(someVar)) 
    .orderBy(stockmarket.date.desc()) 
    .list(stockmarket.date, stockmarket.quote); 

Querydsl utiliza la generación de código a través de APT para reflejar un esquema de SQL a tipos de consulta de Java. De esta forma, las consultas son totalmente seguras para el tipo (o "compatibles con el esquema" con SQL).

Soy el mantenedor de Querydsl, por lo que esta respuesta es parcial.

Publiqué una comparación de Querydsl con otros marcos here.

+0

Volveré a votar para contrarrestarlo. –

7

Estas son algunas buenas bibliotecas patentadas para crear typesafe consultas SQL de forma dinámica

Aparte de lo anterior, hay siempre

  • Hibernate/JPA CriteriaQuery
  • MyBatis

Su ejemplo en jOOQ:

create.select(DATE, QUOTE) 
     .from(STOCKMARKET) 
     .where(CORP.equal(123)) 
     .orderBy(DATE.desc()); 
0

Puede utilizar el naskarlab/fluidez-consulta:

https://github.com/naskarlab/fluent-query

Ejemplo:

@Test 
public void testSelect() { 
    String expected = "select e0.* from Customer e0"; 

    String actual = new QueryBuilder() 
     .from(Customer.class) 
     .to(new NativeSQL()) 
     .sql() 
     ; 

    Assert.assertEquals(expected, actual); 
} 

Se puede ver más ejemplos en las pruebas unitarias del proyecto:

https://github.com/naskarlab/fluent-query/blob/master/src/test/java/com/naskar/fluentquery/TestNativeSimpleConventionQueryTest.java

Cuestiones relacionadas