Hibernate(4)【hql语句使用】

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();
  1. 聚合函数
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)

你可能感兴趣的:(框架)