1

これが私のクラスです:

public class TrainLate {

private int id;
private Date startDate;
private Date endDate;
private Set<TrainSchedule> ts=new HashSet<TrainSchedule>(); 
public TrainLate(){}
public TrainLate(int id, Date startDate, Date endDate) {
    super();
    this.id = id;
    this.startDate = startDate;
    this.endDate = endDate;
}

    // setters and getters...
}

タイプ日付はjava.sql.Date

別のクラスでは、HQLを使用します。

String hql="SELECT new TrainLate(id,startDate,endDate) FROM TrainLate "+                "WHERE id="+String.valueOf(index);

ここで、indexはintパラメーターです。

これが「TrainLate.hbm.xml」です。

<class name="classes.TrainLate">
    <id name="id">
        <generator class="native"/>
    </id>
    <property name="startDate"/>
    <property name="endDate"/>
    <set name="ts"  lazy="false" cascade="all-delete-orphan" inverse="true">
           <key column="trainLateID" />
           <one-to-many class="classes.TrainSchedule" />
          </set>  
</class>

例外は次のとおりです。

Unable to locate appropriate constructor on class [classes.TrainLate] [SELECT new TrainLate(id,startDate,endDate) FROM classes.TrainLate WHERE id=0]

ここで、「classes」はパッケージ名です。

4

2 に答える 2

3

まず、Hibernateでは、エンティティにデフォルトの引数なしコンストラクターが必要です。

2番目:hqlは次のようになります:"from TrainLate t where t.id = :id"

String hql = "from TrainLate t where t.id = :id";
List<TrainLate> result = (List<TrainLate>) session.createQuery(hql).setParameter("id", 1).list();

またはさらに良い。エンティティのIDがわかっている場合は、hqlで検索する必要はありません。

TrainLate t = session.get(TrainLate.class, 1L); // I assume your id is a Long

nullこれは、エンティティが見つからない場合に返されます。

また

TrainLate t = session.load(TrainLate.class, 1L); // I assume your id is a Long

ObjectNotFoundExceptionこれは、エンティティが見つからない場合にをスローします。

于 2012-09-11T06:43:59.077 に答える
1

ばかげているように聞こえるかもしれませんが、これをデバッグしようとしたことがありますか?

私の最初の考えは(休止状態の場合:))、No-OPコンストラクターを使用してTrainLateのオブジェクトを作成し、一連のセッターを呼び出してid、startDate、およびendDateを設定することです。

コードスニペットに表示されませんでした...

于 2012-09-11T06:44:28.403 に答える