HQL基本查询
• 查询指定类对应表格的所有记录
– 例如:
Session session = sessionFactory.openSession();
Query query = session.createQuery("from User");
List names = query.list();
Iterator iterator = names.iterator();
while(iterator.hasNext()) {
User user = (User) iterator.next();
System.out.println(user.getId()+"/t"+user.getAge()+"/t"+ user.getName());
}
• 也可以指定类的全名
– 例如:
Query query = session.createQuery("from onlyfun.caterpillar.User");
– HQL本身不区分大小写,不过要注意类的名称必须区分大小写。
• 在查询类对应的表格时,需注意到继承的问题,Hibernate会自动判定继承关系,如果查询的类是某类的父类,则会返回与父类、子类对应的所有表格记录,
– 例如如果查询java.lang.Object,由于Object在Java中是所有类的父类别,所以下面这个查询会返回数据库中所有表格的记录:
Query query = session.createQuery("from java.lang.Object");
• 针对某个属性作查询
– 例子如下:
Session session = sessionFactory.openSession();
Query query = session.createQuery("select user.name from User as user");
List names = query.list();
Iterator iterator = names.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
• 查询两个以上的属性,查询的结果会以数组的方式返回
– 例子如下:
Session session = sessionFactory.openSession();
Query query = session.createQuery("select user.age, user.name from User as user");
List names = query.list();
Iterator iterator = names.iterator();
while(iterator.hasNext()) {
Object[] obj = (Object[]) iterator.next();
System.out.println(obj[0] + "/t" + obj[1]);
}
• 如果User类提供有适当的构建方法,则可以在使用HQL时直接指定新建一个对象传回
– 例如若User如下设计:
public class User {
private Integer id;
private String name;
private Integer age;
public User() { }
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
....}
• 则在使用HQL查询时可以如下:
Session session = sessionFactory.openSession();
Query query = session.createQuery("select new User(user.name, user.age) from User as user");
List names = query.list();
Iterator iterator = names.iterator();
while(iterator.hasNext()) {
User user= (User) iterator.next();
System.out.println(user.getAge() + "/t" + user.getName());
}
– 注意,这个返回的User实例并未与数据库有任何关联,可以试着取得id属性,可以发现它的值是null,如果试图使用Session的saveOrupdate()方法,则会新增一条记录而不是更新原有的记录。
– 使用distinct去除资料重复的记录
– 例子:
Query query = session.createQuery("select distinct user.age from User as user");
List names = query.list();
Iterator iterator = names.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
• 在HQL中使用函数
– 例如取得记录集的大小:
Query query = session.createQuery("select count(*) from User as user");
List names = query.list();
Iterator iterator = names.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
– 使用avg()取得属性的平均值:
Query query = session.createQuery("select avg(user.age) from User as user");
List names = query.list();
Iterator iterator = names.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
– 使用upper()函数将字符串转为大写:
Query query = session.createQuery("select upper(user.name) from User as user");
List names = query.list();
Iterator iterator = names.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
where子句
• 可以使用where子句来限定查询的条件,除了 = 运算之外,还有 >、>=、<、<=、!= 或 <>等比较运算
– 例如:
Session session = sessionFactory.openSession();
Query query = session.createQuery("from User user where user.name='caterpillar'");
List names = query.list();
Iterator iterator = names.iterator();
while(iterator.hasNext()) {
User user = (User) iterator.next();
System.out.println(user.getAge() + "/t" + user.getName());
}
• 在where子句上进行表达式
– 例如:
Query query = session.createQuery("from User user where (user.age / 10 = 3)");
• 在where子句上使用and、or
– 例如: Query query = session.createQuery("from User user where (user.age > 20) and (user.name = 'caterpillar')");
• is not nullL与is null则可以测试字段值是否为空值
– 例如: Query query = session.createQuery("from User user where user.name is not null");
• between可以测试字段值是否在指定的范围之内
– 例如: Query query = session.createQuery("from User user where user.age between 20 and 30");
• 使用in或not in来测试字段值是否在您指定的集合中
– 例如: Query query = session.createQuery("from User user where user.name in('caterpillar', 'momor')");
• like或not like可以让您进行模糊条件搜寻
– 例如想搜寻名称中含有cater开头的资料: Query query = session.createQuery("from User user where user.name like 'cater%'");
order by子句
• 对查询结果使用order by进行排序
– 例子: Query query = session.createQuery("from User user order by user.age");
• 可使用desc反排序
– 例子: Query query = session.createQuery("from User user order by user.age desc");
• 同时指定两个以上的排序方式
– 例如先按照"age"反序排列,如果"age"相同,则按照"name"顺序排列: Query query = session.createQuery("from User user order by user.age desc, user.name");
group by子句
• 使用GROUP BY子句,自动将指定的字段依相同的内容群组
– 例如依字段"sex"分组并作平均: Query query = session.createQuery("select user.sex, avg(user.age) from User user group by user.sex");
– 执行的结果如下:
+-------------------------------+
| sex | avg(age) |
+-------------------------------+
| male | 30 |
+-------------------------------+
| female | 25 |
+-------------------------------+
• 结合having子句
– 例如只将平均大于20的记录分组显示出来: Query query = session.createQuery("select user.sex, avg(user.age) from User user group by user.sex having avg(user.age) > 20");
使用HQL更新和删除记录
• 在Hibernate 2时,HQL只用于查询资料,要更新或删除资料,则是依赖于Session的update()、saveOrUpdate()、delete()等方法
• 在Hibernate 3中,HQL新增了update与delete语句,可以直接使用HQL指定更新或删除
– 例如使用update子句进行更新:
Session session = sessionFactory.openSession();
Transaction tx= session.beginTransaction();
Query query = session.createQuery("update User set name='momor' where name='bbb'");
query.executeUpdate();
tx.commit();
session.close();
• 使用delete子句进行资料删除
– 例子:
Session session = sessionFactory.openSession();
Transaction tx= session.beginTransaction();
Query query = session.createQuery("delete User where name='bush'");
query.executeUpdate();
tx.commit();
session.close();
• 进行资料添加
– 例子:
Session session = sessionFactory.openSession();
Transaction tx= session.beginTransaction();
session.save (User);
tx.commit();
session.close();