是一种hibernate查询语言,是hibernate识别的数据库查询语言。
是一种面向对象的查询语言,没有表,字段的概念只用对象属性的概念。
因为hibernate存在方言,hibernate按照方言的指定将HQL查询转化成所对应的不同的数据库环境语言
使用HQL进行查询避免JDBC的复杂步骤,只需要四部
1、 得到session
2、编写HQL语句
3、 创建Query对象
4、执行查询,得到结果,结果是一个list
例:
public static void main(String[] args) {
// 编写查询语句
// --Street是实体类的类名,而不是数据库里面的名字,区分大小写
// String sql="select * from Street as street ";
// String sql = "from Street ";// 等价于上sql
// --h.title中title是House对象的属性而非数据库中title字段
String hql = "from House as h where h.title like '%' and h.floorage between 1 and 50000";
// 打开一个session
Session session = HibernateSessionFactory.getSession();
// 创建query
Query query = session.createQuery(hql);
// 执行查询--返回一个封装好的list,它根据ORM映射查询后找到对应的实体进行了封装
List<House> streetList = query.list();
session.close();
for (int i = 0; i < streetList.size(); i++) {
System.out.println(streetList.get(i).getTitle()
+"~~"+ streetList.get(i).getFloorage());
}
}
Where子句:
String hql = "from House as h where h.title like '%x%' and h.floorage between 1 and 50000";
(部分)属性查询:
例1、public List<Users> findByName(String name) {
// String hql =
// "select u.id,u.telephone from Users as u where u.name like '%"
// + name + "%'";
String hql = "select new Users(u.id,u.telephone) from Users as u where u.name like '%"//封装成对象,实体中必须有和此封装对应的构造函数
+ name + "%'";
Session session = super.getSession();
Query query = session.createQuery(hql);
List<Users> list = query.list();
session.close();
return list;
}
public static void main(String[] args) {
List<Users> list = new UsersDaoImpl().findByName("a");
for (int i = 0; i < list.size(); i++) {
Users items = list.get(i);
System.out.println(items.getId() + " " + items.getTelephone());
}
}
参数绑定:
:name命名参数,根据此参数名进行参数设定
例2:
public List<House> findByTitleAndFloorage(String title, int floorage) {
String hql = "from House as h where h.title like :title and h.floorage=:floorage";
Session session = super.getSession();
Query query = session.createQuery(hql);
query.setString("title", "%"+title+"%");
query.setInteger("floorage", floorage);
List<House> houseList = query.list();
session.close();
return houseList;
}
HQL常用聚合函数
Count()
public long computeHouseCount(int userId){
String hql="select count(h.id) from House as h where h.userId=?";
Session session=super.getSession();
Query query=session.createQuery(hql);
query.setInteger(0, userId);
List list= query.list();
//int ret=(Integer)list.get(0);
long ret=(Long)query.uniqueResult();//得到一个值
session.close();
return ret;
}
Max() min()
select max(h.price),min(h.price) from House as h
select h from House as h where datepart(yyyy,h.pubdate)=?
Avg() sum()
分组
分页
Query实现简单的分页
setFirstResult(int fr),记录第一条记录的位置(pageIndex-1)*pageSize
setMaxResult(int mr)设置最大返回记录数 pageSize
例:
/**
* 分页查询
*/
public List<House> findAll(int pageNo, int pageSize) {
String hql="from House as h order by h.pubdate desc";
Session session=super.getSession();
Query query=session.createQuery(hql);
query.setMaxResults(pageSize);
query.setFirstResult((pageNo-1)*pageSize);
List<House> houseList=query.list();
return houseList;
}