2009-10-23 31 views
24

Có loại công cụ nào có sẵn cho phép một công cụ thực hiện truy vấn JPQL dựa vào cơ sở dữ liệu "trực tiếp" không? Tôi muốn gõ các truy vấn JPQL trực tiếp vào một cửa sổ và thực thi chúng.Công cụ để thực hiện truy vấn JPQL?

Tất nhiên nó có thể yêu cầu tôi phải làm một chút cấu hình để nó có thể nhận thức được thực thể JPA của tôi, vv, nhưng tôi đoán nó có thể được thực hiện ... Bất cứ ai biết của một công cụ như vậy?

Cảm ơn.

Trả lời

0

Bạn đã kiểm tra xem NetBeans, Eclipse hoặc IntelliJ có làm những gì bạn muốn không?

Đặc biệt với Plugin Hibernate cho Eclipse, điều này có thể thực hiện được (nếu bạn sử dụng Hibernate làm JPA Backend).

+0

Hình như NetBeans có thể cung cấp một số loại hỗ trợ cho các loại công cụ này trong 7.0 . – Rintoul

17

Cho đến khi Eclipse Dali nhận được a generic JPQL editor bạn có thể sử dụng Hibernate Tools. Hibernate Tools làm việc với Dali và cung cấp một trình soạn thảo truy vấn HQL/JPQL sử dụng Hibernate để thực hiện các truy vấn.

Một giải pháp thay thế sẽ là sử dụng JPA Query Tool [JQT], trình biên tập và truy vấn JPA tương tác. Nó có thể gần hơn với những gì bạn đang tìm kiếm (chạy như một ứng dụng độc lập).

alt text

Cập nhật: Tôi đã gỡ bỏ công cụ gợi ý cho NetBeans, dự án không hoạt động và không cung cấp bất cứ điều gì.

+0

Thứ được lưu trữ trên Google Code dường như chưa tải xuống bất kỳ thứ gì. – Rintoul

+0

Không giống như các công cụ Hibernate hỗ trợ JPQL ... có lẽ chỉ HQL? – Rintoul

+0

Đối với trình soạn thảo netbeans-jpa, bạn thực sự phải tự mình kiểm tra và tự xây dựng dự án. Đối với các công cụ Hibernate, HQL có nhiều hơn JPQL, vì vậy nó có thể sử dụng được. –

0

Bạn cũng có Hibernate Tool Suite, mà là dựa trên NetBeans

+0

Bạn đã sử dụng mã này với mã hiện tại và thấy nó có hữu ích không? Bản phát hành cuối cùng cho điều này là vào năm 2006, và dường như không có gì xảy ra kể từ đó. – trafalmadorian

3

Tôi nghĩ rằng tôi đã thử tất cả các công cụ và IDE.

Cuối cùng, tôi đã giải quyết bằng mã bit sau ...

QueryEditor chạy dưới dạng UnitTest.

Giả sử bạn đã có UnitTests, bạn tránh gặp rắc rối khi định cấu hình PersistenceContexts, DataSources, Drivers, thư viện, vv ... Nó cũng cho phép bạn chuyển đối tượng Entity dưới dạng tham số.

Và khi bạn hoàn tất, hãy sao chép truy vấn-Chuỗi thành định nghĩa @NamedParameter và đặt @Test để bật = 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

Nếu có bất kỳ lỗi nào trong truy vấn được đặt tên, nó có cung cấp lỗi cụ thể hoặc thông báo "lỗi trong truy vấn được đặt tên" cụ thể không? –

1

Bạn có thể muốn thử Vestigo. Nó là một công cụ truy vấn & trình duyệt hỗ trợ cả JDO (JDOQL) và JPA (JPQL) và có thể được sử dụng độc lập hoặc được cài đặt vào IDE Eclipse của bạn như một trình cắm thêm.

+2

Có vẻ thú vị. Nhưng cần lưu ý rằng nó có vẻ là một sản phẩm thương mại. – MRalwasser

Các vấn đề liên quan