hibernate学习(查询)

数据查询是hibernate的一个亮点,hibernate为程序猿提供了多种的查询方式,分为以下三种:
1.hibernate语言查询,也就是我们今天需要说的hql查询,这种查询是完全面向对象的方式来查询,将查询语句封装为对象来进行操作。符合面向对象的思维来维护数据库。
2.hibernate标准化查询:(criteria query)将查询语句封装成对象进行操作。
3.原声sql查询:直接使用标准sql语言来进行查询。

hql查询所有

在学习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是一样的,只不过一切都是面向对象的查询,将需要查询的表名换成对应的实体类名称,将需要查询的字段换成对应实体类的属性,即可。

hql条件查询

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

sql查询

查询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的查询,就学习到这里。

你可能感兴趣的:(hibernate)