请求处理失败

时间:2014-07-07 14:24:54

标签: java spring hibernate hql

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

2 个答案:

答案 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);

明显更好。