数据查询是hibernate的一个亮点,hibernate为程序猿提供了多种的查询方式,分为以下三种:
1.hibernate语言查询,也就是我们今天需要说的hql查询,这种查询是完全面向对象的方式来查询,将查询语句封装为对象来进行操作。符合面向对象的思维来维护数据库。
2.hibernate标准化查询:(criteria query)将查询语句封装成对象进行操作。
3.原声sql查询:直接使用标准sql语言来进行查询。
在学习hql查询之前,我先插入一些记录到userinfo表中:
//解析hibernate.cfg.xml文件
Configuration cfg = new Configuration().configure();
//创建SessionFactory(创建连接池)
SessionFactory factory = cfg.buildSessionFactory();
//创建session
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
for (int i = 0; i < 80; i++) {
UserInfo info = new UserInfo();
info.setUserName("test"+i);
info.setUserPass(String.valueOf(Math.random()*1));
session.save(info);
}
transaction.commit();
这里我给userinfo表中一次性插入了80条记录。解下来使用hql查询所有的数据:
String hql = "from UserInfo";
Query query = session.createQuery(hql);
Listlists = query.list();
for (UserInfo userInfo : lists) {
System.out.println(userInfo.getUserName());
}
这里,查询所有并没像sql中有”select *”那样,而是直接省略了该语句,其实hql和sql是一样的,只不过一切都是面向对象的查询,将需要查询的表名换成对应的实体类名称,将需要查询的字段换成对应实体类的属性,即可。
1.查询id>10并且id<20的记录
String hql = "from UserInfo where userId > 10 and userId < 20 ";
//或者
String hql = "from UserInfo where userId between 10 and 20 ";
2.按照userId降序排列
String hql = "from UserInfo order by userId desc";
3.使用参数占位符查询
String hql = "from UserInfo where userId between ? and ? order by userId desc";
Query query = session.createQuery(hql);
query.setInteger(0, 30);
query.setInteger(1,40);
List<UserInfo>lists = query.list();
4.绑定有意义的参数占位符
String hql = "from UserInfo where userId between :begin and :end order by userId desc";
Query query = session.createQuery(hql);
query.setInteger("begin", 20);
query.setInteger("end",40);
Listlists = query.list();
5.查询userId值最大的记录
String hql = "select max(userId) from UserInfo";
Query query = session.createQuery(hql);
Listlists = query.list();
Object result = query.uniqueResult();
System.out.println(result);
可以看到由于这里只会查询出一条记录,所以使用query.uniqueResult();来查询。
6.hql分页查询
查询从第3条记录开始,间隔5条记录
String hql = "from UserInfo";
Query query = session.createQuery(hql);
query.setFirstResult(3);
query.setMaxResults(5);
List<UserInfo>lists = query.list();
7.只查询某些字段
String hql = "select new com.mydb.entity.UserInfo(userId,userPass) from UserInfo";
Query query = session.createQuery(hql);
List<UserInfo>lists = query.list();
这里需要注意就是由于这里使用了两个参数的构造函数,因此,需要在UserInfo实体类当中添加这两个参数的构造方法。
或者可以这样写:
String hql = "select userId,userPass from UserInfo";
Query query = session.createQuery(hql);
List lists = query.list();
for (Object object : lists) {
Object[]objects = (Object[]) object;
System.out.println(objects[0]+"----++++"+objects[1]);
}
查询userinfo表中的所有数据
String sql = "select * from userinfo";
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.addEntity(UserInfo.class);
List lists = sqlQuery.list();
for (UserInfo userInfo : lists) {
System.out.println(userInfo.getUserName());
}
说明一点:sqlQuery.addEntity(UserInfo.class);是添加hibernate查询以后从object转换到的类型。
好了,关于hibernate的查询,就学习到这里。