我用hibernate的时间也不算长,对hibernate并不是很了解 感觉用反向工程 hibernate用起来太方便啦 返回的还都是对象 太舒服了
可是随着写的程序的要求的变化,感到它每次返回的都是对象,有时还是挺不爽的,比如要查询元组的个数,还得一堆转换
eg. :long count=0;
count= ( (Long) session.createQuery("select count(distinct sno)from Submit").iterate().next()).intValue();
我现在是想查询未提交答卷的学生的
String sql="from Login as lg " +
"where lg.sno not in " +
"(select sno from Submit )";
这样写不对,当登录或提交都不止一次时,需要去除重复
* 因为每次读出一个学号 当登录2次时就会有2个学号(字符串)
* 假如提交一次的话,那么就会有一个学号找不到与之对应的学号 所以那个学生又被查询出来了
现在我去重 :
String sql="select distinic sno from Login as lg " +
"where lg.sno not in " +
"(select sno from Submit )";
Query query=session.createQuery(sql);
list=query.list();
这样也不对了
因为这样查出来得只是学号(字符串)而不是对象了
说明一点:我的主键id本身并没有什么意义,而且是自增的
如果用jdbc就没这种问题了
一种解决方法就是再hibernate框架下再去用jdbc,代码如下:
Session session=HibernateSessionFactory.getSession();
Transaction tc=session.beginTransaction();
String sql="select distinct sno,sname from login "+
"where sno not in " +
"(select distinct sno from Submit )";
Connection conn=session.connection();
try {
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getString("sname"));
}
tc.commit();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
HibernateSessionFactory.closeSession();
}