HQL使用技术
编写HQL语句
1.from字句
from cn.hibernatedemo.entity.Dept——说明cn.hibernatedemo.entity.Dept是全限定类名
from Dept——说明类名Dept省略了包名
from Dept as dept—from Dept dept
说明:这两条HQL语句为持久化类Dept指派了别名dept,可以在HQL语句中使用这个别名。关键字as是可选的。
<
2.select子句——select子句用于选取对象和属性
select dept.deptName frrom Dept as dep
说明:select字句选取了一个属性deptName,也可以选取多个属性
select dept from Dept as dept——select后跟的是别名dept
3.where字句——where子句用于表达查询的限制条件
4.使用表达式——表达式一般用在where子句中
from Dept dapt where lower(dept.deptName) = 'sales'
说明:这条HQL语句用于查询名称是sales的部门,不区分大小写。lower()函数用于把字符串中的每个字母改为小写。
from Emp where year(hireDate) = 1980
说明:这条HQL用于查询1980年入职的员工。year函数用于获取日期字段的年份
5.order by子句
from Emp order by hireDate asc
说名:这条HQL语句用于查询所有员工,并按员工入职时间升序排序。关键字asc或desc是可选的,用于指明按照升序或降序进行排序,默认升序排列。
from Emp order by hireDate, sa,lary desc
说明:这条HQL语句用于查询所有员工,先按员工入职时间升序,然后时间相同的再按员工工资排序
<
执行HQL语句
Session session = HibernateUtil.openSession();
//String hql = "from Users";
String hql = "from Users where name = 'asdas'";
Query query = session.createQuery(hql);
List<Users> list = query.list();
for (Users u:list){
System.out.println(u);
}
session.close();
}
动态查询
//示例一
public static void main(String[] args) {
Session session = HibernateUtil.openSession();
//绑定参数 命名参数以":"开头
String hql = "from House where title = :title and floorage > :floorage";
Query query = session.createQuery(hql);
// Map
// Map<String,Object> datas = new HashMap<String, Object>();
// datas.put("title","中关村");
// query.setProperties(datas);
// Object
House house = new House();
house.setTitle("中关村");
house.setFloorage(80);
query.setProperties(house);
List<House> list = query.list();
for (House h : list) {
System.out.println(h);
}
}
//示例二
public static void main(String[] args) {
House house = new House();
house.setPrice(2000);
house.setContact("李阳");
querySelect(house);
}
public static void querySelect(House house) {
Session session = HibernateUtil.openSession();
String hql = "from House where 1=1 ";
if (house != null) {
if (0 != house.getPrice() && !"".equals(house.getPrice())) {
hql += " and price > :price ";
}
if (null != house.getContact() && !"".equals(house.getContact())) {
hql += " and contact = :contact ";
}
}
Query query = session.createQuery(hql);
query.setProperties(house);
List<House> list = query.list();
for (House h: list ){
System.out.println(h);
}
}
绑定各种类型的参数
1.Query接口提供的绑定不同数据类型参数的方法
setBoolean():绑定类型为java.lang.Boolean的参数
setByte():绑定类型为java.lang.Byte的参数
setDouble():绑定类型java.lang.Double的参数
setDate():绑定类型为java.util.Date的参数
setString():绑定类型为java.lang.Strikng的参数
以上,每个方法都有两种重载形式,如setString()方法;
(1).setString(int position, String val):按位置绑定参数
(2).setString(String position, String val):按名称绑定参数
2.setProperties()方法:绑定命名参数与一个对象的属性值
3.使用uniqueResult()方法获取唯一结果
<
分页和投影
public static void main(String[] args) {
queryPage(1,3);
}
public static void queryPage(int pageNo,int pageSize){
Session session = HibernateUtil.openSession();
String hql = " select new Users(name,telephone) from Users ";
Query query = session.createQuery(hql);
query.setFirstResult( (pageNo-1)*pageSize);
query.setMaxResults(pageSize);
List<Users> list = query.list();
for (Users u:list ){
System.out.println(u.getName()+"|"+u.getTelephone());
}
}
query.setFirstResult(0)——用于设置需要返回的第一条记录位置(下标从0开始)
query.setMaxResults(5)——用于设置最大返回记录条数
投影查询
String hql = " select name from Users "
说明:每条查询结果仅包含一个结果列
String hql = " select new Users(name,telephone) from Users "
说明:每条查询结果仅包含不止一个结果列