【问题标题】:Sending JPA data from server to client?将 JPA 数据从服务器发送到客户端?
【发布时间】:2012-08-29 23:43:04
【问题描述】:

我正在使用 Eclipse Juno IDE。

我有一个客户端-服务器应用程序。在服务器端我有一个实体(旅行) 我还有另一个处理 JPA 查询的类。我正在从数据库中接收数据 但是当我试图将它作为向量发送给客户端时,我在 客户端,上面写着“Cant cast pack.db.Travels to 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;
    }
}

查询类

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 实现的代码

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;

在这里我可以从每一列中获取每一列数据,将其保存为记录,然后将其放入 Vector 中。那么JPA如何实现呢?有可能吗?

【问题讨论】:

    标签: database jpa vector client-server entity


    【解决方案1】:

    将一个对象转换为另一个类不会神奇地改变对象的类型。它只允许将其引用为更具体的类。因此,仅当列表确实是 Vector 时,将 List 转换为 Vector 才有效。

    getResultList() 返回一个List。这就是javadoc所说的。返回的具体类取决于 JPA 提供程序,但我很确定它们都不会返回 Vector,因为 Vector 是一个不应再使用的类,因为 Java 1.2。

    此外,此特定查询不返回 Object[],而是返回 Travels 的实例(应该命名为 Travel,顺便说一句)。

    所以方法应该是:

    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;
    }
    

    服务器不应该关心客户端需要 Vector 来满足旧的 Swing 类。如果您在客户端确实需要 Vector,则从返回的列表中创建一个:

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

    【讨论】:

    • 您好 JB Nizet,我知道查询返回 Travel 实例,我只是尝试这种方式来检查它是否有效并禁用异常。感谢您的回复,我会尝试您的建议
    • 我能够将数据发送到客户端.. 但是当客户端将数据读取为“Vector x = (Vector)from_server.readObject()”时,我在客户端中遇到异常SIDE 说:不能从 pack.db.Travels 转换为 java.util.Vector。现在 pack.db.Travels 是 SERVER SIDE 中的一个实体
    • 你在客户端得到的就是你在服务器端发送的。如果您在服务器端发送 List,您将在客户端获得 List。如果您感到困惑,请向我们展示查询的更新代码、在服务器端发送结果的代码、在客户端读取结果的代码以及异常的完整堆栈跟踪。
    • JB Nizet,正如我所说,我能够从服务器获取数据。我检查了异常的原因是什么,它是客户端中的 JTable c'tor .. 对于 c'tor 需要 Vector of Vectors 的行和标题是 Vector。所以我正在尝试将我从查询中获得的列表转换为 Vector 以便在表中显示它。我该怎么做?
    • 创建一个新的(外部)向量。遍历您从服务器端获得的List&lt;Travel&gt;。对于每个 Travel,创建一个新的(内部)向量。使用您要从 Travel 显示的数据填充此内部向量。将内部向量添加到外部向量。或者,更好的是,直接使用 List 创建您自己的 AbstractTableModel 子类。见docs.oracle.com/javase/tutorial/uiswing/components/…
    【解决方案2】:

    好的,我就是这样解决的:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-04-11
      • 2021-12-07
      • 1970-01-01
      • 2020-08-17
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      相关资源
      最近更新 更多