@Override
public List<Projet> getScenariosByProjet(int idProjet) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
String sql = "select * from projet where scenario="+idProjet;
Query query = session.createSQLQuery(sql);
List<Projet> scenarios = (List<Projet>) query.list();
return scenarios;
}
类Projet:
public class Projet {
private int idProjet;
private String nomProjet;
private Set<Projet> scenarios = new HashSet<Projet>();
//.....
hbm文件:
<hibernate-mapping>
<class name="com.model.Projet" table="PROJET">
<id name="idProjet" type="int">
<column name="IDPROJET" />
<generator class="increment" />
</id>
<property name="nomProjet" type="java.lang.String">
<column name="NOMPROJET" />
</property>
<set name="scenarios" table="PROJET" inverse="false" lazy="true" order-by="SCENARIO">
<key>
<column name="SCENARIO" />
</key>
<one-to-many class="com.model.Projet" />
</set>
//.....
我得到了这个例外:
exception org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是java.lang.ClassCastException:[Ljava.lang.Object;无法转换为com.model.Projet org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:927) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:822) javax.servlet.http.HttpServlet.service(HttpServlet.java:647) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:796) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
这是方法:
public ModelAndView saveProject(@RequestParam(value="action", required=false) String action){
List<Projet> scenarios = projetService.getScenariosByProjet(1);
model.addObject("scenarios", scenarios);
List<Projet> sousProjets = projetService.getSsProjetsByProjet(id);
model.addObject("sousprojets", sousProjets);
Iterator<Projet> scens = scenarios.iterator();
while(scens.hasNext()){
Projet projet2 = (Projet) scens.next();
System.out.println("projet scenario : " + projet2.getName);
}
return new ModelAndView("/resume","sousprojets", sousProjets);
}
答案 0 :(得分:2)
使用Hibernate模板进行查询,如下所示
public Collection<Projet> getScenariosByProjet(int idProjet) {
return getHibernateTemplate().find("from projet where scenario="+idProjet);
}
答案 1 :(得分:1)
好的,现在很清楚:你使用的是createSQLQuery
。问题是然后query.list()
确实返回List
,但列表的元素是对象数组(Object []),每列而不是Projet
实例<的标量值/ strong>即可。所以运行时的异常。
您只需使用以下命令更改查询:
String sql = "from Projet projet where scenario="+idProjet;
Query query = session.createQuery(sql);
它会起作用。
但是:你正在做的事情很糟糕:你永远不应该在查询中连接值,但总是使用准备好的查询(只需谷歌或查看SO以获取 SQL注入来理解为什么...)。然后它会变成:
String sql = "from Projet projet where scenario=?";
Query query = session.createQuery(sql);
query.setInteger(0, id);
明显更好。