hql:hibernate query language
1.无论链接什么数据库,hql都是统一的,hibernate 会根据hql语句生成与底层数据库连接的相关的sql语句
2.sql查询的是表和表中的列,而hql查询的是对象和对象中的属性;
1.简单查询:
Session s = hibernateutils.getSession();
s.beginTransSaction();
String hql="From User"
Query q = s.createQuery(hql);
List list = q.list();
for(User u:list){
System.out.println(u);
}
2.起别名:
“SELECT u.uid,u.uname FROM User u”
当查询只有一个列的时候查询的是object
当查询只有多个列的时候查询的是object[]
3.选择
String hql = "FROM User WHERE id > 5";
String hql = "FROM User WHERE id BETWEEN 3 AND 6";
String hql = "FROM User WHERE id = 1 OR id = 5";
String hql = "FROM User WHERE id > 5 AND money > 500";
String hql = "FROM User WHERE id IN(1,3,5)";
5.使用new 语法
“SELECT new User(u.uid,u.uname) FROM User u”
6.带排序
“FROM User ORDER BY MONEY vDESC”
7.模糊查询
“FROM User WHERE name like ‘_大%’”
8.uniqueResult获得唯一的结果,如果是多个结果就报异常
User u =(User)q.uniqueResult();
9.分页查询
String hql = "FROM User"
Query q=s.createQuery(hql);
q.setFirstResult(0);
q.setMaxResult(3);
List list = q.list();
String hql = "SELECT COUNT(*),AVG(money),min(money),max(money),sum(money) FROM User";
11.分组
string hql = "SELECT count(*),length(name) FROM User GROUP BY length(name) "
12.查询时使用占位符,下表从0开始
String hql ="FROM Emp WHERE sal BETWEEN ? AND ?"
Query q = s.createQuery(hql);
q.setInteger(0,600);
q.setInteger(1,700);
List list = q.list();
13.查询时使用变量名占位(:变量名)
String hql="FROM Emp WHERE sal BETWEEN :minsal AND :maxsal"
Query q = s.createQuery(hql);
q.setInteger("minsal",600);
q.setInteger("maxsal",700);
14.当参数为集合时,setParameterList
String hql ="FROM Emp WHERE eid IN(:ids)"
Query q = s.createQuery(hql);
q.setParameterList("ids",Arrays.asList(1,2,3))
15.hql也能执行update和delete, 但是不能INSERT!(因为Hibernate的hql语句是通过面向对象实现的,insert完全不涉及查询筛选所以不能执行添加操作)
16.hql的update和delete不会通知session缓存, session.refresh(对象) 可以直接查库
17.hql的select不会从缓存中取出数据,但是会向缓存中存放数据,所以每次使用list()获取数据时,都不会使用到缓存中的数据!
18.使用Query类的iterate()方法,可以让select语句完全使用缓存中的数据
Query q = s.createQuery("FROM Emp WHERE eid > 7");
List list = q.list();
String hql = "FROM Emp";
Query q2 = s.createQuery(hql);
Iterator it = q2.iterate();
while(it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
// 但是会产生的N+1问题:
// a. 先查询id列表 (1)
// b. 再按照每一个id查询每一个对象 (N)