2009-10-23 28 views
24

¿Hay algún tipo de herramienta disponible que permita ejecutar consultas JPQL contra una base de datos "directamente"? Me gustaría escribir consultas JPQL directamente en una ventana y ejecutarlas.¿Herramienta para ejecutar consultas JPQL?

Por supuesto, probablemente me requerirá hacer un poco de configuración para que esté al tanto de mis entidades JPA, etc., pero supongo que podría hacerse ... ¿Alguien sabe de una herramienta así?

Gracias.

Respuesta

0

¿Ha comprobado si NetBeans, Eclipse o IntelliJ hacen lo que usted quiere?

Especialmente con el complemento de Hibernate para Eclipse, esto debería ser posible (si utiliza Hibernate como su backend JPA).

+0

Parece que NetBeans podrían proporcionar algún tipo de soporte para este tipo de cosas en 7,0 . – Rintoul

17

Hasta que Eclipse Dali obtenga a generic JPQL editor puede usar Hibernate Tools. Hibernate Tools trabaja con Dali y proporciona un editor de consultas HQL/JPQL que utiliza Hibernate para ejecutar las consultas.

Una alternativa sería usar el JPA Query Tool [JQT], un editor de consultas JPA interactivo y un corredor. Puede estar más cerca de lo que está buscando (se ejecuta como una aplicación independiente).

alt text

Actualización: me quita la herramienta sugerida para NetBeans, el proyecto está inactivo y no aporta nada.

+0

Lo que se aloja en Google Code parece que todavía no se puede descargar nada. – Rintoul

+0

No parece que Hibernate Tools admita JPQL ... ¿tal vez solo HQL? – Rintoul

+0

Para netbeans-jpa-editor, tiene que pagar y construir el proyecto usted mismo. Para Hibernate Tools, HQL tiene más que JPQL, por lo que debería ser utilizable. –

0

También tiene Hibernate Tool Suite, que está basado en NetBeans

+0

¿Lo ha usado con el código actual y lo encontró útil? La última versión de esto fue en 2006, y nada parece haber sucedido desde entonces. – trafalmadorian

3

creo que he intentado todas las herramientas y el IDE de.

Al final, que se establecieron con el siguiente fragmento de código ...

El queryEditor se ejecuta como un unittest.

Suponiendo que ya tiene UnitTests, evita la molestia de configurar PersistenceContexts, DataSources, Drivers, libraries, etc ... También le permite pasar instancias de entidad como parámetros.

Y cuando haya terminado, copie query-String en una definición de @NamedParameter y configure @Test para enable = false.

import org.apache.commons.lang.builder.ReflectionToStringBuilder; 
import org.apache.commons.lang.builder.ToStringStyle; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.testng.annotations.Test; 

import javax.persistence.Query; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Set; 

public class TestGeneric extends AbstractModelTest { 

    private static final Logger logger = LoggerFactory.getLogger(TestGeneric.class.getName()); 

    /** 
    * This is not a test. Just a convenience method to edit queries 
    */ 
    @Test(enabled = true) 
    public void queryEditor() throws Exception { 
     String query = "SELECT mpe " + 
         " FROM ActiveProduct apt JOIN apt.supportedProduct spt JOIN apt.account act JOIN act.merchantProfile mpe" + 
         " WHERE mpe.id = :mpeId "; 
     Class resultClass = MerchantProfile.class; 
     Map<String, Object> parameters = new HashMap<String, Object>(); 
     parameters.put("mpeId", 1L); 
     performQuery(query, resultClass, parameters); 
    } 

    private <T> void performQuery(String jplQuery, Class<T> type, Map parameters) throws Exception { 
     Query query = this.em.createQuery(jplQuery, type); 

     Set<Map.Entry<String, Object>> rawParameters = parameters.entrySet(); 
     for (Map.Entry<String, Object> entry : rawParameters) { 
      query.setParameter(entry.getKey(), entry.getValue()); 
     } 
     List<T> resultList = query.getResultList(); 

     if (resultList.size() > 0) { 
      int count = 0; 
      StringBuffer resultString; 
      for (Object o : resultList) { 
       resultString = new StringBuffer(++count + " - "); 
       dumpObject(o, resultString); 
       logger.info(resultString.toString()); 
      } 
     } else { 
      logger.info("Empty result list"); 
     } 
    } 

    private void dumpObject(Object o, StringBuffer resultString) throws Exception { 
     if (o == null) { 
      resultString.append("NULL"); 
     } else if (o instanceof Object[]) { 
      Object[] row = (Object[]) o; 
      resultString.append("["); 
      for (int i = 0; i < row.length; i++) { 
       dumpObject(row[i], resultString); 
      } 
      resultString.append("]"); 
     } else if (o instanceof Long || 
        o instanceof Double || 
        o instanceof String) { 
      resultString.append(o.getClass().getName() + ": " + o); 
     } else { 
      resultString.append(ReflectionToStringBuilder.toString(o, ToStringStyle.SHORT_PREFIX_STYLE)); 
     } 
    } 
+0

Si hay algún error en la consulta con nombre, ¿proporcionará un error específico o un mensaje genérico de "error en la consulta con nombre"? –

1

Es posible que desee intentar Vestigo. Es una herramienta de consulta del explorador & compatible con JDO (JDOQL) y JPA (JPQL) y se puede utilizar de forma independiente o instalada en su Eclipse IDE como complemento.

+2

Parece interesante. Pero debe tenerse en cuenta que parece ser un producto comercial. – MRalwasser

Cuestiones relacionadas