1) 说明
1> HQL: hibernate query language
2> 特点
1. 与sql类似,sql中的语法基本上都可以直接使用
2. sql查询的是表和表中的列,HQL查询的是对象与对象中的属性
3. HQL的关键字不区分大小写,但是因为查询的是类与类中属性,所以必须区分大小写
4 select可以省略
2) 简单查询
说明:
1> 查询的是对象中的所有属性
2> select可以省略不写
3> 必须有默认构造函数
factory = new Configuration().configure().buildSessionFactory();
session = factory.openSession();
Transaction tx = session.beginTransaction();
String hql = "FROM User";
List<User> list = session.createQuery(hql).list();
for(User u:list)
{
System.out.println(u);
}
tx.commit();
3)带上过滤条件的查询
说明:推荐使用别名,因为这样可以排除列名和关键字重名的情况(如select * from User u where u.desc=0)
hql = "FROM User u where u.id>5";
List<User> list = session.createQuery(hql).list();
4) 使用order by进行排序
hql = "FROM User u ORDER BY u.name ,u.id DESC";
List<User> list = session.createQuery(hql).list();
说明:先使用name降序排序,如果name相同,那么再使用id降序排列
5) 只选择部分属性
1> 只选择一个属性
hql = "SELECT u.name FROM User u";
List<String> names = session.createQuery(hql).list();
此处的list()的返回值是一个List,其中元素类型就是该对象属性的类型
2> 选择多个属性
hql = "SELECT new User(u.id,u.name) FROM User u ";
List<User> list = session.createQuery(hql).list();
注意:使用new的时候必须有对应的构造函数,否则会抛异常
6) 分页查询
hql = "FROM User";
Query query = session.createQuery(hql);
query.setFirstResult(0);
query.setMaxResults(7);
List<User> list = query.list();
firstResult指定的第一个结果的前一个下标,maxResult指定这一页查询多少个(如本例中查询1-7条记录,包含第七条)
7) 聚集函数
hql = "SELECT COUNT(*)FROM User";
Number count = (Number) session.createQuery(hql).uniqueResult();
hql = "SELECT MAX(id) FROM User";
Number count = (Number) session.createQuery(hql).uniqueResult();
hql = "SELECT MIN(id) FROM User";
Number count = (Number) session.createQuery(hql).uniqueResult();
count()返回的是Long类型,但是max()、min()是根据字段类型来确定的,所以为了统一使用Number
8)指定hql中参数
1>使用?,并使用下标来指定参数值
hql = "SELECT u FROM User u WHERE u.id =?";
List list = session.createQuery(hql).setParameter(0, 3)//
.list();
2>使用变量名来指定参数值
hql = "SELECT u FROM User u WHERE u.id =:id";
List list = session.createQuery(hql)//
.setParameter("id", 3)//
.list();
3>使用IN的时候设置参数
hql = "SELECT u FROM User u WHERE u.id in(:id)";
List list = session.createQuery(hql)//
.setParameterList("id", new Object[]{1,2,3})//
.list();
9)使用命名查询
也就是将hql语句放在配置文件中,通过名称来调用,这样可以解耦(一般对哪个类进行查询,hql就写在那个类的映射文件中)
映射文件中:
<query name="queryById">
<![CDATA[
FROM User u where u.id>=:idMin AND u.id<=:idMax
]]>
</query>
因为hql中可能会有<,>这种在xml中有特殊含义的 字符,所以必须使用<![CDATA[ ]]>将hql包含进来,表示里面没有特殊字符,全部当成字符串好了
List list = session.getNamedQuery("queryById")//
.setParameter("idMin", 3)//
.setParameter("idMax", 5)//
.list();
10) 使用hql执行更新操作
hql = "UPDATE User u SET u.name=:newName WHERE u.id=5";
session.createQuery(hql)//
.setParameter("newName", "moonlight")//
.executeUpdate();
说明:使用hql执行更新,session中对象的状态并不会立即更新,如果需要获得最新的状态,需要使用refresh(),来再进行一次查询
11) 使用hql执行删除操作
hql = "DELETE FROM User u WHERE u.id=5";
session.createQuery(hql)//
.executeUpdate();
说明:使用hql执行删除,session中对象的状态并不会立即更新,如果需要获得最新的状态,需要使用refresh(),来再进行一次查询