Hibernate Query Language
1) 语法
FROM 实体名称[as 别名] WHERE key = value
Key:必须是实体的属性名称。
执行时:session.createQuery(sHql);
如:
String sHql = "from User";
Query query = session.createQuery(sHql);
List<User> users = query.list();
库中数据:
for (User u : users) {
System.out.println(u.getId() + "===" + u.getName());
}
输出:
2) 分页
String sHql = "from User";
Query query = session.createQuery(sHql);
query.setFirstResult(1);// pageNo
query.setMaxResults(3);// pageSize
List<User> users = query.list();
3) 使用select
Hql语句是没有select的,如果非要加上select,或者希望获取的是部分字段而不是全部时需要使用select。
但是select返回的是object,不是对应的po实体。
有两种方法进行转换:
1.使用构造函数
如:给User对象添加一个构造函数:
public User(String name, Double height){
this.name = name;
this.height = height;
}
如下调用:
String sHql = "select new User(u.name, u.height) from User u";
Query query = session.createQuery(sHql);
List<User> users = query.list();
for (User u : users) {
System.out.println(u.getId() + "===" + u.getName() + "===" + u.getHeight());
}
结果如下:
2.sql返回对象(见sql语句章节)
String sql = "select * from user";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(User.class);
List<User> users = query.list();
for (User u : users) {
System.out.println(u.getId() + "===" + u.getName() + "===" + u.getHeight());
}
3.下面两种方法用于获取数据,不转对象,并不常用,先列在这里。
使用map
使用list
4) 获取一条记录
如果使用hql语句,获取到的是list。如:
List<User> users = query.list();
但如果明知道where条件下最多只会返回一条记录。又使用users.get(0);就显得代码咯唆了。可以使用如下:
String sHql = "from User where id = 1";
User u = (User) session.createQuery(sHql).uniqueResult();
System.out.println(u.getId() + "===" + u.getName() + "===" + u.getHeight());
如果是通过主键获取的话使用get或load更好。
一是方便,二是性能好。
sessionFactory中有一级缓存,当使用了get或load后,会将结果记录到缓存中,当下次有相同查询时直接读取结果,而不会查库。
即:下面的两条语句将只会查一次库。
User u = (User) session.get(User.class, Long.valueOf(1));
User u2 = (User) session.get(User.class, Long.valueOf(1));
5) 聚合函数
聚合函数返回的肯定是一个值,如:
select avg(height) from user
select max(height) from user
Hql代码如下:
String sHql = "select max(height) from User";
Double u = (Double) session.createQuery(sHql).uniqueResult();
System.out.println(u);