我一直在研究hibernate / JPA项目,在开发过程中我创建了一个方法来检索名为 Appel_Offre .java的对象列表,并在运行时发现异常发生了... 这是方法: 我有一个对象 Appel_Offre.java 和另一个名为 Modalite_Appel_Offre.java 的对象 这是两个对象的映射: 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 为什么hibernate会触发此异常? 谢谢。
答案 0 :(得分:1)
我认为这是你的疑问:
from Appel_Offre m , Modalite_Appel_Offre mod where mod.nom_mod= ?
这不只是要求Appel_Offre实例......它要求Appel_Offre加入Modalite_Appel_Offre(FROM子句中有多个表)。 因此,Hibernate会让你成为一个奇怪的List,它将是这两个表的复合连接:不仅仅是Appel_Offre实例。 我可能误解了查询应该做什么。但是,无论如何,您只需要在FROM子句中使用Appel_Offre。类似的东西:
from Appel_Offre where m.ao = ?
答案 1 :(得分:0)
解决此问题的一种更简洁的方法是使用addEntity和this。
示例:
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并迭代并构造你想要的对象类型。