2009-10-23 14 views
24

Esiste qualche tipo di strumento che consente di eseguire query JPQL su un database "direttamente"? Vorrei digitare le query JPQL direttamente in una finestra ed eseguirle.Strumento per eseguire query JPQL?

Ovviamente probabilmente mi richiederebbe un bel po 'di configurazione in modo che fosse a conoscenza delle mie entità JPA, ecc., Ma immagino che potrebbe essere fatto ... Qualcuno sa di uno strumento del genere?

Grazie.

risposta

0

Hai controllato se NetBeans, Eclipse o IntelliJ fanno ciò che vuoi?

Soprattutto con Hibernate Plugin per Eclipse, questo dovrebbe essere possibile (se si utilizza Hibernate come back-end JPA).

+0

Sembra NetBeans potrebbe essere fornendo una sorta di supporto per questo tipo di cose in 7.0 . – Rintoul

17

Fino a quando Eclipse Dali diventa a generic JPQL editor è possibile utilizzare Hibernate Tools. Hibernate Tools funziona con Dali e fornisce un editor di query HQL/JPQL che usa Hibernate per eseguire le query.

Un'alternativa sarebbe utilizzare il JPA Query Tool [JQT], un editor di query JPA interattivo e un corridore. Potrebbe essere più vicino a quello che stai cercando (viene eseguito come applicazione standalone).

alt text

Aggiornamento: ho rimosso lo strumento consigliato per NetBeans, il progetto è inattivo e non fornisce nulla.

+0

La cosa ospitata su Google Code non sembra avere ancora nulla da scaricare. – Rintoul

+0

Non sembra che Hibernate Tools supporti JPQL ... forse solo HQL? – Rintoul

+0

Per netbeans-jpa-editor, devi davvero effettuare il checkout e creare il progetto da solo. Per Hibernate Tools, HQL ha più di JPQL, quindi dovrebbe essere utilizzabile. –

0

Hai anche Hibernate Tool Suite, che è basato su NetBeans

+0

Hai usato questo con il codice corrente e l'hai trovato utile? L'ultima versione di questo è stata nel 2006 e da allora sembra non essere successo nulla. – trafalmadorian

3

penso ho provato tutti gli strumenti e IDE.

Alla fine, ho risolto con i seguenti po 'di codice ...

Il queryEditor viene eseguito come un unittest.

Supponendo di avere già UnitTest, si evita il fastidio di configurare PersistenceContexts, DataSources, Drivers, librerie, ecc ... Inoltre, consente di passare istanze Entity come parametri.

E quando hai finito, copia la stringa di query in una definizione di @NamedParameter e imposta @Test su 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

Se sono presenti errori nella query denominata, fornirebbe un errore specifico o un messaggio generico di "errore nella query denominata"? –

1

Potresti provare a provare Vestigo. È uno strumento di query & browser che supporta sia JDO (JDOQL) che JPA (JPQL) e può essere utilizzato stand-alone o installato in Eclipse IDE come plug-in.

+2

Sembra interessante. Ma va notato che sembra essere un prodotto commerciale. – MRalwasser

Problemi correlati