查询一个对象(实体类必须有一个不带参数的构造方法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Test
public void test01() {
    Session session = null;
    try {
        session = HibernateUtil.openSession();
        /**
         * 对于HQL而言,都是基于对象进行查询的
         */
        Query query = session.createQuery("from Special");
        List<Special> spes = query.list();
        for(Special spe:spes) {
            System.out.println(spe.getName());
        }
    catch (Exception e) {
        e.printStackTrace();
    finally {
        HibernateUtil.close(session);
    }
}

使用select查询

1
2
3
4
5
6
7
8
9
//不能使用select *进行查询
//Query query = session.createQuery("select * from Special");
/**
 * 可以使用链式查询的方式
 */
List<Special> spes = session.createQuery("select spe from Special spe").list();
for(Special spe:spes) {
    System.out.println(spe.getName());
}

条件查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
List<Student> stus = session
    .createQuery("from Student where name like '%张%'")
    .list();
for(Student stu:stus) {
    System.out.println(stu.getName());
}
-------------------------------------------------
/**
 * 基于?的条件的查询
 * 特别注意:jdbc设置参数的最小下标是1,hibernate是0
 */
List<Student> stus = session
    .createQuery("from Student where name like ?")
    .setParameter(0"%李%")
    .list();
for(Student stu:stus) {
    System.out.println(stu.getName());
}
------------------------------------------------
/**
 * 还可以基于别名进行查询,使用:xxx来说明别名的名称
 */
List<Student> stus = session
    .createQuery("from Student where name like :name and sex=:sex")
    .setParameter("name""%刘%")
    .setParameter("sex""男")
    .list();
for(Student stu:stus) {
    System.out.println(stu.getName());
}

使用uniqueResult可以返回唯一的一个值/对象

1
2
3
4
5
6
7
8
9
10
11
12
13
Long stus = (Long)session
        .createQuery("select count(*) from Student " +
                 "where name like :name and sex=:sex")
        .setParameter("name""%刘%")
        .setParameter("sex""男")
        .uniqueResult();
System.out.println(stus);
------------------------------------------------------
Student stu = (Student)session
        .createQuery("select stu from Student stu where id=:id")
        .setParameter("id"1)
        .uniqueResult();
System.out.println(stu.getName());

基于投影的查询,通过在列表中存储一个对象的数组

1
2
3
4
5
6
7
List<Object[]> stus = session
        .createQuery("select stu.sex,count(*) from Student stu " +
                "group by stu.sex")
        .list();
for(Object[] obj:stus) {
    System.out.println(obj[0]+":"+obj[1]);
}

如果对象中相应的导航对象,可以直接导航完成查询

1
2
3
4
5
6
7
8
List<Student> stus = session
    .createQuery("select stu from Student stu " +
        "where stu.classroom.name=? and stu.name like ?")
    .setParameter(0"计算机教育班").setParameter(1"%张%")
    .list();
for(Student stu:stus) {
    System.out.println(stu.getName());
}

可以使用in来设置基于列表的查询,此处的查询需要使用别名进行查询

特别注意,使用in的查询必须在其他的查询之后

1
2
3
4
5
6
7
8
9
List<Student> stus = session
    .createQuery("select stu from Student stu " +
        "where stu.name like ? and stu.classroom.id in (:clas)")
    .setParameter(0"%张%")
    .setParameterList("clas"new Integer[]{1,2})
    .list();
for(Student stu:stus) {
    System.out.println(stu.getName());
}

使用setFirstResult和setMaxResult可以完成分页的offset和pageSize的设置

1
2
3
4
5
6
7
8
9
List<Student> stus = session
    .createQuery("select stu from Student stu " +
        "where stu.classroom.id in (:clas)")
    .setParameterList("clas"new Integer[]{1,2})
    .setFirstResult(0).setMaxResults(15)
    .list();
for(Student stu:stus) {
    System.out.println(stu.getName());
}

可以通过is null来查询为空的对象,和sql一样不能使用=来查询null的对象

1
2
3
4
5
6
7
8
List<Student> stus = session
    .createQuery("select stu from Student stu " +
        "where stu.classroom is null")
    .setFirstResult(0).setMaxResults(15)
    .list();
for(Student stu:stus) {
    System.out.println(stu.getName());
}

连接查询

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 * 使用对象的导航可以完成连接,但是是基于Cross JOIN,效率不高,
 * 可以直接使用JOIN来完成连接
 */
List<Student> stus = session
    .createQuery("select stu from Student stu " +
        "left join " +
        "stu.classroom cla where cla.id=2")
    .setFirstResult(0).setMaxResults(15)
    .list();
for(Student stu:stus) {
    System.out.println(stu.getName());
}

统计班级学生的人数

1
2
3
4
5
6
7
List<Object[]> stus = session
    .createQuery("select cla.name,count(stu.classroom.id) from Student stu " +
        "right join stu.classroom cla group by cla.id")
    .list();
for(Object[] stu:stus) {
    System.out.println(stu[0]+","+stu[1]);
}

把查询出来的数据封装成一个对象。

定义一个学生对象DTO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package org.zttc.itat.model;
/**
 * DTO对象没有存储的意义,仅仅是用来进行数据的传输的
 *
 */
public class StudentDto {
    private int sid;
    private String sname;
    private String sex;
    private String cname;
    private String spename;
    //省去set get方法
    public StudentDto(int sid, String sname,
            String sex, String cname,String spename) {
        super();
        this.sid = sid;
        this.sname = sname;
        this.sex = sex;
        this.cname = cname;
        this.spename = spename;
    }
      
    public StudentDto() {
    }
      
}

查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
 * 直接可以使用new XXObject完成查询,
 * 注意,一定要加上Object的完整包名
 * 这里使用的new XX,必须在对象中加入相应的构造函数
 */
List<StudentDto> stus = session
    .createQuery("select new org.zttc.itat.model.StudentDto" +
    "(stu.id as sid,stu.name as sname,stu.sex as sex," +
    "cla.name as cname,spe.name as spename) " +
    "from Student stu left join stu.classroom cla " +
    "left join cla.special spe")
    .list();
for(StudentDto stu:stus) {
    System.out.println(stu.getSid()+","+stu.getSname()+","+
    stu.getSex()+","+stu.getCname()+","+stu.getSpename());
}

having是为group来设置条件的

1
2
3
4
5
6
7
8
List<Object[]> stus = session.createQuery("select spe.name," +
        "(count(stu.classroom.special.id)) from Student stu right join " +
        "stu.classroom.special spe group by spe " +
        "having count(stu.classroom.special.id)>150")
    .list();
for(Object[] obj:stus) {
    System.out.println(obj[0]+":"+obj[1]);
}

常用HQL(Hibernate Query Language)查询的更多相关文章

  1. hql(Hibernate Query Language)

    1.Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供了更加丰富的和灵活的查询特性,因此Hibernate ...

  2. Hibernate Query Language查询:

    Hibernate Query Language查询: Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供 ...

  3. Hibernate查询(HQL——Hibernate Query Language)

    HQL查询 HQL提供了是十分强大的功能,它是针对持久化对象,用取得对象,而不进行update,delete和insert等操作.而且HQL是面向对象的,具备继承,多态和关联等特性. from子句: ...

  4. HQL: The Hibernate Query Language

    Chapter 14. HQL: The Hibernate Query Language 14.1. Case Sensitivity 14.2. The from clause 14.3. Ass ...

  5. HQL基础Query简单查询结果for输出和Iterator输出

    HQL第一次课: hibernate Query Language:hibernate 查询语言 语法: query: String hql="from dept"; Query ...

  6. HQL(Hibernate Query Language)

    1. NativeSQL > HQL > EJB QL(JP QL 1.0) > QBC(Query By Criteria) > QBE(Query By Example)2 ...

  7. Hibernate hql(hibernate query language)基础查询

    在开发过程中,数据库的操作我们其实更多的用到的是查询功能,今天开始学习hql的查询. 1.加入必要的工具 2.Hibernate配备的一种非常强大的查询语言,这种查询语言看上去很像sql.但是不要被语 ...

  8. HQL(Hibernate Query language)语言

    现在有两张表:student(学生表),classroom(教室表). //对象 Student 对应 student 表中有四个字段,分别是:id,name,age,classroom; publi ...

  9. Hibernate的批量查询——HQL

    HQL(Hibernate Query Language)查询: 1.查询所有学生信息: public static void testSel() { Session session = Hibern ...

随机推荐

  1. php 解析xml

    解析xml,返回一个对象. $obj = simplexml_load_string($XML, 'SimpleXMLElement', LIBXML_NOCDATA); 查看结果var_dump($ ...

  2. php 的session机制 和ecshop session机制

    一.默认机制,用磁盘文件来实现PHP会话.php.ini配置:session.save_handler = files 1.session_start() A. session_start()是ses ...

  3. 怎么使用 ab.exe 测试多个url。 how to use ab.exe test many url

    from a commandline in windows: for /F %q in (list.txt) DO ab -n 1000 https://test.com/search?%q   I ...

  4. 编辑控件的警告提示是:This text field does not specify an inputType or a hint

    没有设置editText的inputtype属性,比如<android:inputtype="textpassword"> http://binuu.blog.51ct ...

  5. centos 下Qt安装 mysql驱动(亲测可行)

    (前半部分没有试过,因为我的有mysql驱动,实在抱歉) 1.预防万一,先安装一下mysql-devel(一定要装!). 不安装的话后面编译会出现找不到-lmysqlclient的问题. 2. 开始编 ...

  6. 【Android】10.4 卡片视图

    分类:C#.Android.VS2015: 创建日期:2016-02-19 一.简介 Android 从5.0开始包含了一个全新的卡片视图小部件,这个新的小部件默认就像一张带有圆角和轻微阴影的白色卡片 ...

  7. app 图标规格参考表

    转自:http://www.cocoachina.com/appstore/top/2012/1105/5031.html 像我一样记不住iOS应用图标像素尺寸的开发者不在少数,我经常需要查询不同设备 ...

  8. 改变mysql数据库用户的权限

    mysql> grant all on *.* to test@'%';Query OK, 0 rows affected (0.00 sec) mysql> flush privileg ...

  9. cocos2d-x 数据存储

    这一章中,我们从一个小小的金币数入手,讨论了数据持久化的话题.我们尽量使用引擎提供的数据存储方法,以最大可能地适应跨平台需求.这里介绍的存储方法本质上都是基于 XML 的,对于 1 MB 以下的存储规 ...

  10. vue2的全局变量的设置

    最近在学习VUE.js 中间涉及到JS全局变量,与其说是VUE的全局变量,不如说是模块化JS开发的全局变量. 1.全局变量专用模块 就是以一个特定模块来组织管理这些全局量,需要引用的地方导入该模块便好 ...