2012-09-05 172 views
0

我正在使用Eclipse juno IDE。從服務器發送JPA數據到客戶端?

我有一個客戶端 - 服務器應用程序。在服務器端我有一個實體(遊記) 和我有另一個類處理JPA查詢。我從數據庫中 recieving數據,但是當我試圖把它發送作爲載體,以客戶端我得到的 客戶端的例外,那說:「廣東話投pack.db.Travels到Java。 util.vector」

這裏是我的代碼: 實體:

package pack.db; 

import java.io.Serializable; 
import java.sql.Date; 
import java.sql.Time; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 

@Entity 
public class Travels implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE) 
    @Column(name="id") 
    private int id; 

    @Column(name="taxi_number") 
    private String taxiNumber; 

    @Column(name="travel_date") 
    private Date travelDate; 

    @Column(name="travel_time") 
    private Time travelTime; 

    @Column(name="cost") 
    private Double travelCost; 

    public Travels() { 
     super(); 
    } 

    public void setNumber(String number) 
    { 
     this.taxiNumber = number; 
    } 

    public void setDate(Date date) 
    { 
     this.travelDate = date; 
    } 

    public void setTime(Time time) 
    { 
     this.travelTime = time; 
    } 

    public void setCost(Double cost) 
    { 
     this.travelCost = cost; 
    } 
} 

QueryClass

public Vector retrieveAllTravelsData(Date[] travelDate, Time[] travelTime) { 
    List<Object[]> allTravels = (List<Object[]>)em.createQuery("SELECT t FROM Travels t WHERE t.travelDate between ?1 and ?2 and " + 
               "t.travelTime between ?3 and ?4") 
           .setParameter(1, travelDate[0]) 
           .setParameter(2, travelDate[1]) 
           .setParameter(3, travelTime[0]) 
           .setParameter(4, travelTime[1]).getResultList(); 
    return (Vector) allTravels; 
} 

所以我想要做的就是發送「allTravels」作爲客戶端的矢量,因爲我需要在客戶端填充JTABLE。所以我試圖將返回數據 從查詢轉換爲OBJECT [](因爲JTABLE的構造函數需要Object [] []用於行)併發送它..但我仍然在客戶端獲得異​​常說 「不能投pack.db.Travel到java.util.Vector中的」 ..我不認爲我需要添加 旅遊實體在客戶端..所以我怎樣才能將數據發送到客戶端?

更具體。我有這樣的代碼與JDBC implemntation

public Vector retrieveAllTravelsData(Date[] travelDate, Time[] travelTime) { 
    Vector rows_data = new Vector(); 
    String sql = "SELECT * FROM taxis.travels " + " WHERE travel_date BETWEEN ? AND ? AND travel_time BETWEEN ? AND ?"; 
    try { 
     statement = (PreparedStatement) connection.prepareStatement(sql); 
     statement.setDate(1, travelDate[0]); 
     statement.setDate(2, travelDate[1]); 
     statement.setTime(3, travelTime[0]); 
     statement.setTime(4, travelTime[1]); 
     rs = statement.executeQuery(); 
     ResultSetMetaData meta = rs.getMetaData(); 
     int cols_count = meta.getColumnCount(); 

     while (rs.next()) { 
      Vector record = new Vector(); 
      for (int i = 0; i < cols_count; i++) { 
       record.add(rs.getString(i+1)); 
      } 
      rows_data.addElement(record); 
     } 
    } catch (SQLException e) { 
     while (e != null) { 
      e.printStackTrace(); 
      e = e.getNextException(); 
     } 
    } 
    return rows_data; 

在這裏,我可以從每列每列數據保存爲一個記錄,然後把它放在向量。那麼JPA如何實現呢?可能嗎?

回答

2

將對象投射到另一個類不會奇蹟般地改變對象的類型。它只允許將它引用爲更具體的類。因此,只有列表確實是一個Vector,才能將列表轉換爲向量。

getResultList()返回List。這就是javadoc所說的。返回的具體類取決於JPA提供程序,但我很確定它們都不返回Vector,因爲Vector是自Java 1.2以來不應再使用的類。此外,這個特定的查詢不返回Object[],而是Travels(它應該被命名爲Travel,BTW)的實例。

所以方法應該是:

public List<Travel> retrieveAllTravelsData(Date[] travelDate, Time[] travelTime) { 
    List<Travel> allTravels = (List<Travel>) em.createQuery("SELECT t FROM Travel t WHERE t.travelDate between ?1 and ?2 and " + 
               "t.travelTime between ?3 and ?4") 
           .setParameter(1, travelDate[0]) 
           .setParameter(2, travelDate[1]) 
           .setParameter(3, travelTime[0]) 
           .setParameter(4, travelTime[1]).getResultList(); 
    return allTravels; 
} 

服務器不應該關心的是,客戶端需要一個載體來滿足老Swing類。如果你真的需要在客戶端的一個載體,然後創建一個從返回的列表:

Vector<Travel> travelsAsVector = new Vector(travelsAsList); 
+0

嗨JB Nizet,我知道該查詢返回的實例旅遊,我只是試圖這種方式來檢查它是否工作,並禁用例外.. 感謝您的迴應,我會嘗試您的建議 – eliorsh

+0

我能夠發送數據到客戶端..但是當客戶端讀取 數據爲 'Vector x =(Vector)from_server.readObject()' 我在客戶端得到一個異常,說:不能從pack.db.Travels轉換爲java.util 。向量。 現在pack.db.Travels是服務器端的一個實體 – eliorsh

+0

您在客戶端獲得的是您在服務器端發送的內容。如果您在服務器端發送List ,則客戶端將獲得List 。如果您感到困惑,請向我們展示查詢的更新代碼,在服務器端發送結果的代碼,在客戶端讀取結果的代碼以及異常的完整堆棧跟蹤。 –

0

好吧,我解決它這樣:

public Vector retrieveAllTravelsData(Date[] travelDate, Time[] travelTime) { 

    javax.persistence.Query q = (javax.persistence.Query)em.createNativeQuery("SELECT * 
      from Travels WHERE travel_date between ?1 and ?2") 
      .setParameter(1, travelDate[0]) 
      .setParameter(2, travelDate[1]) 
      .setParameter(3, travelTime[0]) 
      .setParameter(4, travelTime[1]); 
    List<Object[]> result = (List<Object[]>)q.getResultList(); 
    Vector rows = new Vector(); 
    for (int i = 0 ; i < result.size(); i++) 
    { 
     Vector rec = new Vector(); 
     for (int j = 0; j < columnCount; j++) 
     { 
      rec.add(result.get(i)[j].toString()); // returns the specific column value and add it to the vector 
     } 
     rows.addElement(rec); 
    } 
    return rows; 
} 
相關問題