hibenate4.3获得session的方式有所改变,用之前的方法将会提示过期的方法
正确的获取session的方法如下:
public static Configuration config = new Configuration(); public static SessionFactory sessionFactory; public static String config_file = "/hibernate.cfg.xml"; public static void main(String[] args) { // 获得配置文件 config.configure(config_file); StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build(); sessionFactory = config.buildSessionFactory(serviceRegistry); Session session = sessionFactory.openSession();以上为代码片段,获得session前需要首先注册一个Service ,创建session工厂的时候就用该service来作为参数来创建即可
接下来我们说说hibernate的连接查询
首先请看以下两条语句
//String sql="select s1.* from student s1 left join grade g1 on s1.gid=g1.gid"; String hql="select s1,g1.gname,g1.gdesc from student s1,grade g1 where s1.gid=g1.gid";被我注释掉的这行代码适用于sql查询,没有注释的代码适用于hibernate的hql查询
继续看以下代码:
//query = session.createSQLQuery(sql).addEntity(Student.class); query = session.createQuery(hql);正如你看到的那样,使用sql语句来查询,如果要获得正常的实体对象,必须使用addEntity方法
而不能直接查询后强制转换,那样会报错的
接下来的代码就会变得非常简单了。使用sql语句查询的,直接
List list = query.list(); Student s1 = (Student) list.get(0);而使用hql查询的代码,你得这样做,因为他查询了一个实体和另外一个实体的部分字段,完整的代码如下:
List list = query.list(); Object[] obj = (Object[]) list.get(0); System.out.println("s1.sname="+((Student)obj[0]).getSname()); System.out.println("g1.sname="+obj[1]); System.out.println("g1.sdesc="+obj[2]);总结一下hibernate通过hql查询的三种情况:
第一:只查询一个字段,获得是一个object
第二:只查询一个实体,获得到的是一个对象
第三:查询多个字段,获得的是一个object[],长度为select后面展示的字段数
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情