一、条件查询简介

条件查询是更据面向对象特色的数据查询方式,主要通过如下3个类完成

1、Criteria:代表一次查询

2、Criterion:代表一个查询条件

3、Restrictions:产生查询条件的工具类

执行条件查询的步骤

1、获取Hibernate session对象

2、调用session的createCriteria()方法创建Criteria查询对象

3、使用Restrictions的静态方法创建Criterion查询条件

4、通过Criteria的add()方法添加查询条件到Criteria查询中

5、执行Criteria的list()或uniqueResult()方法返回结果集

二、条件查询

1、整表查询

        Criteria c = session.createCriteria(CriteriaTeacher.class);
List<CriteriaTeacher> list = c.list();
for (CriteriaTeacher t : list) System.out.println(t.getName());

2、加入查询条件(通过Criteria的add()方法和Restrictions的静态方法添加)

        Criteria c = session.createCriteria(CriteriaTeacher.class).add(Restrictions.like("name", "%1%"));
List<CriteriaTeacher> list = c.list();
for (CriteriaTeacher t : list) System.out.println(t.getName());

3、关联查询(前提持久化类内部有映射关系)

如果需要使用关联实体的属性来增加查询条件,则需再次使用createCriteria()方法

a、默认链接方式

        Criteria c = session
.createCriteria(CriteriaStudent.class)
.add(Restrictions.like("name", "%1%"))
.createCriteria("criteriaTeacher")
            //.createCriteria("criteriaTeacher", "ct")//为关联实体指定别名
.add(Restrictions.like("name", "%1%"));
List<CriteriaStudent> list = c.list();
for (CriteriaStudent s : list)
System.out.println("studentName = " + s.getName() + " | teacherName = " + s.getCriteriaTeacher().getName());

b、指定链接方式

        Criteria c = session
.createCriteria(CriteriaStudent.class)
.add(Restrictions.like("name", "%1%"))
.createCriteria("criteriaTeacher", JoinType.LEFT_OUTER_JOIN);//左连接方式
List<CriteriaStudent> list = c.list();
for (CriteriaStudent s : list)
System.out.println("studentName = " + s.getName() + " | teacherName = " + s.getCriteriaTeacher().getName());

c、也可以使用createAlias()方法代替createCriteria()方法

        Criteria c = session
.createCriteria(CriteriaStudent.class)
.add(Restrictions.like("name", "%1%"))
.createAlias("criteriaTeacher", "ct")
.add(Restrictions.like("ct.name", "%1%"));
List<CriteriaStudent> list = c.list();
for (CriteriaStudent s : list)
System.out.println("studentName = " + s.getName() + " | teacherName = " + s.getCriteriaTeacher().getName());

4、投影、聚合、分组查询

hibernate中使用Projection接口代表投影运算,hibernate通过Criteria的setProjection(Projections p)方法进行投影运算,其中Projections作为产生Projection的工厂。

a、投影运算查询

        Criteria c = session
.createCriteria(CriteriaStudent.class)
.setProjection(Projections.projectionList()
.add(Projections.rowCount()));//统计表中记录条数
System.out.println(c.uniqueResult());
        Criteria c = session
.createCriteria(CriteriaStudent.class)
.setProjection(Projections.projectionList()
.add(Projections.count("name"))
.add(Projections.groupProperty("name")));//据name值分组统计
List list = c.list();
for(Object ob : list) {
Object[] ob1 = (Object[]) ob;
System.out.println(ob1[1] + " | " + ob1[0]);
}
        Criteria c = session
.createCriteria(CriteriaStudent.class)
.setProjection(Projections.projectionList()
.add(Projections.groupProperty("name")));//name去重后列表
List<String> list = c.list();
for(String s : list) {
System.out.println(s);
}

用alias()方法为指定投影指定别名

        Criteria c = session
.createCriteria(CriteriaStudent.class)
.setProjection(Projections.projectionList()
.add(Projections.alias(Projections.count("name"), "count"))//指定别名
.add(Projections.groupProperty("name")))
.addOrder(Order.desc("count"));//用别名排序
List list = c.list();
for(Object ob : list) {
Object[] ob1 = (Object[]) ob;
System.out.println(ob1[1] + " | " + ob1[0]);
}

b、选择查询(指定要查找的列)

查询一列

        Criteria c = session
.createCriteria(CriteriaStudent.class)
.setProjection(Projections.projectionList()
.add(Property.forName("name")));
List<String> list = c.list();
for(String s : list) {
System.out.println(s);
}

查询多列

         Criteria c = session
.createCriteria(CriteriaStudent.class)
.createAlias("criteriaTeacher", "ct")
.setProjection(Projections.projectionList()
.add(Property.forName("ct.name"))
.add(Property.forName("name")));
List list = c.list();
for(Object ob : list) {
Object[] ob1 = (Object[]) ob;
System.out.println(ob1[1] + " | " + ob1[0]);
}

5、离线查询和子查询

DetachedCriteria代表离线查询(允许再session范围之外创建一个查询)和子查询(把DetachedCriteria的查询结果传入Criteria中作为查询条件时,DetachedCriteria就变成了子查询)

        DetachedCriteria sub = DetachedCriteria
.forClass(CriteriaTeacher.class)
.setProjection(Projections.projectionList()
.add(Property.forName("id")))
.add(Restrictions.like("name", "%1%")); Criteria c = session
.createCriteria(CriteriaStudent.class)
.add(Subqueries.propertyIn("criteriaTeacher", sub));
List<CriteriaStudent> list = c.list();
for(CriteriaStudent s : list) {
System.out.println(s.getName() + " | " + s.getCriteriaTeacher().getName());
}

下面是测试学习时用到的持久化类

@Entity
@Table(name = "criteria_teacher")
public class CriteriaTeacher {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(targetEntity = CriteriaStudent.class, mappedBy = "criteriaTeacher")
private Set<CriteriaStudent> criteriaStudents = new HashSet<CriteriaStudent>(); public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Set<CriteriaStudent> getCriteriaStudents() {
return criteriaStudents;
} public void setCriteriaStudents(Set<CriteriaStudent> criteriaStudents) {
this.criteriaStudents = criteriaStudents;
}
}
@Entity
@Table(name = "criteria_student")
public class CriteriaStudent {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne(targetEntity = CriteriaTeacher.class)
@JoinColumn(name = "teacher_id", referencedColumnName = "id", nullable = false)
private CriteriaTeacher criteriaTeacher; public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public CriteriaTeacher getCriteriaTeacher() {
return criteriaTeacher;
} public void setCriteriaTeacher(CriteriaTeacher criteriaTeacher) {
this.criteriaTeacher = criteriaTeacher;
}
}

测试类

public class CriteriaTestController {
public static void main(String[] args) {
Configuration cf = new Configuration().configure();
SessionFactory sf = cf.buildSessionFactory();
Session session = sf.openSession();
Transaction ts = session.beginTransaction();
try {
Criteria c = session
.createCriteria(CriteriaStudent.class)
.setProjection(Projections.projectionList()
.add(Property.forName("name")));
List<String> list = c.list();
for(String s : list) {
System.out.println(s);
}
ts.commit();
} finally {
session.close();
sf.close();
}
}
}

代码下载:https://github.com/shaoyesun/hibernate_study.git

hibernate之条件查询的更多相关文章

  1. Hibernate的条件查询的几种方式

    1. 第一种,用?占位符,如: //登录(用?占位符) public List<UserPO> LoginUser(UserPO up)throws Exception{ Session ...

  2. Hibernate QBC 条件查询(Criteria Queries) and Demos

    目录 创建一个Criteria 实例 限制结果集内容 结果集排序 关联 动态关联抓取 查询示例 投影Projections聚合aggregation和分组grouping 离线detached查询和子 ...

  3. Hibernate的条件查询的几种方式+查询所有的记录

    条件查询 . 第一种,用?占位符,如: //登录(用?占位符) public List<UserPO> LoginUser(UserPO up)throws Exception{ Sess ...

  4. hibernate不同条件查询结果集一样,主键@ID的原因

    这一周在翻新公司的老项目,遇到了一些预想不到的事情. 其中一个是,使用hibernate查询,不同的查询条件,居然都查到同一条记录,感觉奇怪了,开始以为是session的原因: 后来发现是hibern ...

  5. Hibernate动态条件查询(Criteria Query)

    1.创建一个Criteria实例net.sf.hibernate.Criteria这个接口代表对一个特定的持久化类的查询.Session是用来制造Criteria实例的工厂. Criteria cri ...

  6. hibernate离线条件查询设置or关系

    detachedCriteria.add(Restrictions.or(Restrictions.isNull(""), Restrictions.isNull("&q ...

  7. SpringMVC整合Hibernate实现增删改查之按条件查询

    首先我贴出我项目的结构,只完成了条件查询的相关代码,增删改没有写. 1.新建一个动态Web工程,导入相应jar包,编写web.xml配置文件 <context-param> <par ...

  8. hibernate的Criteria条件查询

    项目中用到了criteria的查询方式,觉得挺好用的,下班后找了一下资料,一边测试,一边在博客上面记录下来 1.初解 快速浏览了资料,大致了解了以下的内容: 1. Hibernate 定义了Crite ...

  9. Hibernate条件查询

    设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装.现在对 Hibernate的Criteria 的用法进行总结:Hibernate 设计了 CriteriaSpecificat ...

随机推荐

  1. Paramiko使用

    1.下载安装 pycrypto-2.6.1.tar.gz (apt-get install python-dev) 解压,进入,python setup.py build[编译],python set ...

  2. 基于Node的Web聊天室

    1 项目名称 Web聊天室(<这是NodeJs实战>第二章的一个案例,把整个开发过程记录下来)

  3. 在wamp下增加多版本的PHP(PHP5.3,PHP5.4,PHP5.5)支持

    1.安装WAMPServer 根据自己的操作系统选择相应的WAMP版本,我这里选择WAMPSERVER-32 BITS & PHP 5.5-2.5, 双击安装,选择安装目录即可,超级简单.根据 ...

  4. 使用qt写的简单的图片浏览器

    功能特别简单,支持png,jpg,bmp,gif文件,支持自适应窗口大小,支持放大缩小,旋转功能还有点问题,支持上下按键选择图片 因为初学qt,所以很多东西都不太会,而且c++学的不是太好,没有怎么使 ...

  5. php隐藏WEBSHELL技巧

    把shell添加到网站logo图片里: cat logo.png shell.php > logo.png 在网站任意一个php文件里添加下面的最简单方法: fputs(fopen('/home ...

  6. php-fpm性能优化

    PHP-fpm PHP-FPM是一个PHPFastCGI管理器,是只用于php的. php-fpm 已经在 Linux.MacOSX.Solaris 和 FreeBSD 上测试通过. 确信 libxm ...

  7. 用户空间与内核空间数据交换的方式(9)------netlink【转】

    转自:http://www.cnblogs.com/hoys/archive/2011/04/10/2011722.html Netlink 是一种特殊的 socket,它是 Linux 所特有的,类 ...

  8. 64_t2

    texlive-biblatex-chem-doc-svn42065-33.fc26.2.no..> 24-May-2017 15:44 1044190 texlive-biblatex-che ...

  9. pycharm双击无响应,打不开问题解决办法

    之前好好的pycharm,突然双击打不开了,怎么办? 亲测有效方案: 第一步:进入如下路径,找到cmd.exe,右键选择“以管理员身份运行”: 第二步:在打开的cmd窗口中,输入 netsh wins ...

  10. Deep Learning基础--机器翻译BLEU与Perplexity详解

    前言 近年来,在自然语言研究领域中,评测问题越来越受到广泛的重视,可以说,评测是整个自然语言领域最核心和关键的部分.而机器翻译评价对于机器翻译的研究和发展具有重要意义:机器翻译系统的开发者可以通过评测 ...