1

私は hibernate/JPA プロジェクトに取り組んでおり、開発中にAppel_Offre .java というオブジェクトのリストを取得するメソッドを作成しましたが、実行時に例外が発生しました... メソッドは次のとおりです。オブジェクトAppel_Offre.javaとModalite_Appel_Offre.javaという別のオブジェクトがあります。 ここでは、2 つのオブジェクトのマッピングを示します: Appel_Offre.java

     @Entity
     @Table(name="Appel_offre")
     public class Appel_Offre {

@Id
@Column(name="num_app_offre",nullable=false, updatable=true)
private String num_app_offre;

@Column(name="nom_maitre",nullable=false, updatable=true)
private String nom_maitre;

@Column(name="objet",nullable=false, updatable=true)
private String objet;

@Column(name="date_depot",nullable=false, updatable=true)
@Temporal(TemporalType.TIMESTAMP)
private Date date_depot;

@Column(name="date_soumission",nullable=false, updatable=true)
@Temporal(TemporalType.DATE)
private Date date_soumission;

@Column(name="garantie",nullable=false, updatable=true)
private int garantie;

@Column(name="delai_livraison",nullable=false, updatable=true)
private int delai_livraison;

@Column(name="caution_provisoir_total",nullable=false, updatable=true)
private float caution_provisoir_total;

@Column(name="commentaire",nullable=false, updatable=false)
private String commentaire;

@Column(name="etat",nullable=false, updatable=true)
private String etat;

@OneToMany(targetEntity=Lot.class,mappedBy="appel_offre", cascade= CascadeType.PERSIST,fetch= FetchType.LAZY)
private List<Lot>  lots;

@OneToMany(targetEntity=Modalite_Appel_Offre.class,mappedBy="ao", cascade= CascadeType.PERSIST,fetch= FetchType.EAGER)
private List<Modalite_Appel_Offre>  mod;

Modalite_Appel_Offre.java :

    @Entity
    @Table(name="Modalite_appel_offre")
    public class Modalite_Appel_Offre {

@Id
@TableGenerator(name="mod_id", table="modalite_id",pkColumnName="id_mod",        pkColumnValue="value of the id",allocationSize=1)
@GeneratedValue(strategy= GenerationType.TABLE, generator="mod_id")
private int id_mod;

@Column(name="nom_modalite")
private String nom_mod;

@ManyToOne
@JoinColumn(name="ao")
private Appel_Offre ao;
 //Getters & Setters

私の方法では、 Modalite_Appel_Offre.nom_modによってAppel_Offreのリストを取得したいのですが、コードは次のとおりです。

    public static List<Appel_Offre> getAppelOffreByModalite(Modalite_Appel_Offre mod){
    List <Appel_Offre> lm=null;
    try{
         session=sf.openSession();
    session.beginTransaction();
     lm=(List <Appel_Offre>)session.createQuery("from Appel_Offre m , Modalite_Appel_Offre mod where mod.nom_mod= ?").setString(0, mod.getNom_mod()).list();
    }
   catch(Exception e){

   }
    finally{
        session.close();
    }
    return lm;
} 

返されたリストをループすると:

     int i = 0;
    for (Appel_Offre ap : lap) {
        data[i][0] = ap.getNum_app_offre();
        data[i][1] = ap.getNom_maitre();

        i++;
    } //data is an array of String 

例外が発生しました:

    java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to gest.BO.Appel_Offre

私が理解できなかったのは、Appel_Offreのリストをループしていて、ループタイプがAppel_Offreであるということです。休止状態がこの例外をトリガーするのはなぜですか? ありがとうございました。

4

2 に答える 2

1

私はそれがあなたの質問だと思います:

from Appel_Offre m , Modalite_Appel_Offre mod どこで mod.nom_mod= ?

それは Appel_Offre インスタンスを要求するだけではありません... Modalite_Appel_Offre に結合された Appel_Offre を要求しています (FROM 句に複数のテーブルがあります)。したがって、Hibernate は奇妙なリストを作成します。これは、Appel_Offre インスタンスだけでなく、これら 2 つのテーブルの複合結合になります。クエリが何をすべきかを誤解している可能性があります。とにかく、FROM 句には Appel_Offre だけが必要です。何かのようなもの:

Appel_Offre から m.ao = ?
于 2013-02-04T15:25:55.380 に答える
0

この問題を解決する 1 つのクリーンな方法は、addEntitythisを使用することです。

例:

List cats = session.createSQLQuery(
    "SELECT {cat}.ID AS {cat.id}, {cat}.SEX AS {cat.sex}, " +
           "{cat}.MATE AS {cat.mate}, {cat}.SUBCLASS AS {cat.class}, ... " +
    "FROM CAT {cat} WHERE ROWNUM<10")
    .addEntity("cat", Cat.class)
.list()

アプローチを使用したくない場合は、 List を取得して反復処理し、必要なオブジェクト型を構築することが唯一の方法だと思います。

于 2013-02-04T15:25:04.550 に答える