Tool to Execute JPQL Queries?

后端 未结 8 1474
我在风中等你
我在风中等你 2020-12-23 17:00

Is there any sort of tool available which allows one to execute JPQL queries against a database \"directly\"? I would like to type JPQL queries directly into a window and e

相关标签:
8条回答
  • 2020-12-23 18:01

    You might want to try Vestigo. It is a query tool & browser supporting both JDO (JDOQL) and JPA (JPQL) and can be used stand-alone or installed into your Eclipse IDE as a plug-in.

    0 讨论(0)
  • 2020-12-23 18:04

    I think I tried all the tools and IDE's.

    In the end, I settled with following bit of code...

    The queryEditor runs as a UnitTest.

    Assuming you already have UnitTests, you avoid the hassle of configuring PersistenceContexts, DataSources, Drivers, libraries, etc... It also alows you to pass Entity instances as parameters.

    And when you're done, copy the query-String to a @NamedParameter definition and set the @Test to 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 讨论(0)
提交回复
热议问题