2009-10-23 88 views
24

是否有任何一种工具可以让我们直接对数据库执行JPQL查询?我想直接在窗口中输入JPQL查询并执行它们。执行JPQL查询的工具?

当然,它可能需要我做相当多的配置,以便它会知道我的JPA实体等,但我想可以完成...任何人都知道这样的工具?

谢谢。

回答

0

您是否检查NetBeans,Eclipse或IntelliJ是否按照您的要求进行了操作?这个应该是可能的(如果你使用Hibernate作为你的JPA后端)。

+0

看起来的NetBeans可能在7.0可以提供某种支持这种东西。 – Rintoul 2009-10-23 20:02:15

17

直到Eclipse Dali获得a generic JPQL editor,您可以使用Hibernate Tools。 Hibernate Tools与Dali协同工作,并提供一个使用Hibernate执行查询的HQL/JPQL查询编辑器。

另一种方法是使用JPA Query Tool [JQT],一个交互式JPA查询编辑器和跑步者。它可能更接近您要查找的内容(作为独立应用程序运行)。

alt text

更新:我删除工具建议的NetBeans,该项目是无效的,不提供任何内容。

+0

谷歌代码上托管的东西似乎还没有可下载的东西。 – Rintoul 2009-10-23 21:02:11

+0

看起来不像Hibernate Tools支持JPQL ......也许只有HQL? – Rintoul 2009-10-23 21:42:32

+0

对于netbeans-jpa-editor,你确实需要签出并自己构建项目。对于Hibernate Tools,HQL不仅仅是JPQL,所以它应该是可用的。 – 2009-10-23 21:53:08

0

你也有Hibernate Tool套房,这是基于NetBeans的

+0

你是否使用过当前代码并发现它很有用?最后一次发布是在2006年,从那时起似乎没有任何事情发生。 – trafalmadorian 2010-12-08 06:37:11

3

我想我尝试了所有的工具和IDE的。

最后,我用的代码如下位结算...

的queryEditor运行的单元测试。

假设你已经有了UnitTests,你可以避免配置PersistenceContexts,DataSources,Drivers,libraries等等的麻烦...... 它也允许你传递Entity实例作为参数。

完成后,将query-String复制到@NamedParameter定义,并将@Test设置为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

如果在命名查询中有任何错误,它是否会提供特定错误或通用“命名查询中的错误”消息? – 2013-01-16 10:57:27

1

您可能需要尝试Vestigo。它是一个支持JDO(JDOQL)和JPA(JPQL)的查询工具&,可以独立使用或作为插件安装到您的Eclipse IDE中。

+2

看起来很有意思。但应该指出,它似乎是一个商业产品。 – MRalwasser 2012-05-02 10:31:34