1

Eclipse ジュノ IDE を使用しています。

私はクライアントサーバーアプリケーションを持っています。サーバー側にはエンティティ (Travels) があり、JPA クエリを処理する別のクラスがあります。データベースからデータを受信して​​いますが、それをベクトルとしてクライアントに送信しようとすると、クライアント側で例外が発生し、「pack.db.Travels を java.util にキャストできません。ベクター"

これが私のコードです: エンティティ:

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

したがって、クライアント側で JTABLE を設定する必要があるため、「allTravels」をベクトルとしてクライアント側に送信する必要があります。だから私はクエリからの戻りデータをOBJECT []にキャストしようとしました(JTABLEのコンストラクターは行にObject [] []を必要とするため)、それを送信しようとしました..しかし、クライアント側で例外が発生します「pack.db.Travel を java.util.Vector にキャストできません」.. クライアント側に travel エンティティを追加する必要はないと思います..どうすればデータをクライアントに送信できますか?

より具体的には..私は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;

ここでは、各列から各列データを取得してレコードとして保存し、それをベクターに入れることができます。では、JPAでどのように実装できますか? 出来ますか?

4

2 に答える 2

2

オブジェクトを別のクラスにキャストしても、魔法のようにオブジェクトの型が変わるわけではありません。より具体的なクラスとしてのみ参照できます。そのため、List から Vector へのキャストは、リストが実際に Vector である場合にのみ機能します。

getResultList()を返しますList。それがjavadocの言うことです。Vector返される具象クラスは JPA プロバイダーに依存しますが、Vector は Java 1.2 以降、使用されなくなったクラスであるため、いずれも を返さないと確信しています。

さらに、この特定のクエリは を返しませんが、( BTWという名前にする必要がありObject[]ます) のインスタンスを返します。TravelsTravel

したがって、メソッドは次のようになります。

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 を必要とすることを気にしません。クライアント側でベクターが本当に必要な場合は、返されたリストからベクターを作成します。

Vector<Travel> travelsAsVector = new Vector(travelsAsList);
于 2012-09-05T11:16:03.847 に答える
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;
}
于 2012-09-05T16:11:31.743 に答える