在給學生排名次時,用到 CASE WHEN @rowtotal = v1.sum THEN @rownum WHEN @rowtotal := v1.sum THEN @rownum := (@rownum + 1) WHEN @rowtotal = 0 THEN @rownum := (@rownum + 1) END
然而hibernate不能執行:=它 所以想到了繞過hibernate,并且將sql放在存儲過程里面。 具體做法如下: 1,獲取連接的方法 /** 從連接池中取得一個JDBC連接 * @throws SQLException */ @SupPRessWarnings(“deprecation”) public Connection getConnection() { try { return sessionFactoryUtils.getDataSource(getSessionFactory()).getConnection(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } 2,在數據庫里面建立一個存儲過程 給出具體步驟 在存儲過程一覽點擊新建存儲過程,一個存儲過程的格式就有了, 將要執行的SQL放在存儲過程里面begin 和end中間 DELIMITER $$
CREATE /[DEFINER = { user | CURRENT_USER }]/ PROCEDURE teaching.getStudentScoreInfo() /*LANGUAGE SQL getStudentScoreInfo | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT ‘string’*/ BEGIN
DELIMITER 2,調用存儲過程 public List getStudentScoreInfo1(Integer team_id, Integer cid, Integer examId) { // TODO Auto-generated method stub List list = null; list = new ArrayList(); try{ //獲取到連接 Connection con = baseDao.getConnection(); //申明存儲過程 String procedure = “{call getStudentScoreInfo()}”; CallableStatement cstmt = con.prepareCall(procedure); //執行存儲過程 ResultSet rsResultSet= cstmt.executeQuery(); while (rsResultSet.next()) { StudentScoreInfoVO studentScoreInfoVO = new StudentScoreInfoVO(); System.out.println(rsResultSet.getString(“id”)+”ckeng2”+rsResultSet.getDouble(“courseplan_id5”)+”ckeng1”+rsResultSet.getDouble(“courseplan_id4”)+”ckeng1”+rsResultSet.getDouble(“courseplan_id3”)); studentScoreInfoVO.setId(rsResultSet.getString(“id”)); //studentScoreInfoVO.setGraderAVG(rsResultSet.getInt(“rownum”)+”“); studentScoreInfoVO.setGradeRanking(rsResultSet.getInt(“rownum”)+”“); list.add(studentScoreInfoVO); } return list; } catch(Exception e){ e.printStackTrace(); } return null; }
新聞熱點
疑難解答