hibernate之条件查询
一、条件查询简介
条件查询是更据面向对象特色的数据查询方式,主要通过如下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之条件查询的更多相关文章
- Hibernate的条件查询的几种方式
1. 第一种,用?占位符,如: //登录(用?占位符) public List<UserPO> LoginUser(UserPO up)throws Exception{ Session ...
- Hibernate QBC 条件查询(Criteria Queries) and Demos
目录 创建一个Criteria 实例 限制结果集内容 结果集排序 关联 动态关联抓取 查询示例 投影Projections聚合aggregation和分组grouping 离线detached查询和子 ...
- Hibernate的条件查询的几种方式+查询所有的记录
条件查询 . 第一种,用?占位符,如: //登录(用?占位符) public List<UserPO> LoginUser(UserPO up)throws Exception{ Sess ...
- hibernate不同条件查询结果集一样,主键@ID的原因
这一周在翻新公司的老项目,遇到了一些预想不到的事情. 其中一个是,使用hibernate查询,不同的查询条件,居然都查到同一条记录,感觉奇怪了,开始以为是session的原因: 后来发现是hibern ...
- Hibernate动态条件查询(Criteria Query)
1.创建一个Criteria实例net.sf.hibernate.Criteria这个接口代表对一个特定的持久化类的查询.Session是用来制造Criteria实例的工厂. Criteria cri ...
- hibernate离线条件查询设置or关系
detachedCriteria.add(Restrictions.or(Restrictions.isNull(""), Restrictions.isNull("&q ...
- SpringMVC整合Hibernate实现增删改查之按条件查询
首先我贴出我项目的结构,只完成了条件查询的相关代码,增删改没有写. 1.新建一个动态Web工程,导入相应jar包,编写web.xml配置文件 <context-param> <par ...
- hibernate的Criteria条件查询
项目中用到了criteria的查询方式,觉得挺好用的,下班后找了一下资料,一边测试,一边在博客上面记录下来 1.初解 快速浏览了资料,大致了解了以下的内容: 1. Hibernate 定义了Crite ...
- Hibernate条件查询
设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装.现在对 Hibernate的Criteria 的用法进行总结:Hibernate 设计了 CriteriaSpecificat ...
随机推荐
- 在Unity中实现屏幕空间反射Screen Space Reflection(2)
traceRay函数 在上一篇中,我们有如下签名的traceRay函数 bool traceRay(float3 start, float3 direction, out float2 hitPixe ...
- java使用simpleDateFormat格式化日期 时间
时间日期标识符: yyyy:年 MM:月 dd:日 hh:1~12小时制(1-12) HH:24小时制(0-23) mm:分 ss:秒 S:毫秒 E:星期几 D:一年中的第几天 F:一月中的第几个星期 ...
- PHP文本式留言板——php经典实例
文件结构: index.php 主页和添加页 show.php 查看留言页 ly.db 文本保存页 doAdd.php 添加功能页 doDel.php 删除功能页 index.php <htm ...
- 去除\ufeff的解决方法,python语言
语言:python 编程工具:pycharm 硬件环境:win10 64位 读取文件过程中发现一个问题:已有记事本文件(非空),转码 UTF-8,复制到pycharm中,在开始位置打印结果会出现 \ ...
- C# 获取计算机cpu,硬盘,内存相关的信息
using System;using System.Management; namespace MmPS.Common.Helper{ /// <summary> /// 获取计算机相关的 ...
- sql函数应用例子
select p.province, data.existUserCount, data.addUserCount, data.cancelUserCount, data.threedayCancel ...
- Gitlab部署及汉化操作
一.简介 GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目. GitLab拥有与Github类似的功能 ...
- Django实现文章按年月归档、点赞和评论、发送邮件
文章归档的实现 我们在创建文章时,会在数据库中存储文章创建的时间这样的字段,一般用的都是datetime类型,记录文章创建的年月日和时分秒,所以我们直接使用文章的创建时间分类是无法实现文章的按年月归档 ...
- Go语言入门之指针的使用
指针的使用: package main import "fmt" func zhi(){ a:= var b *int=&a //声明指针并赋值 *b=3 //改变内存地址 ...
- 495. Teemo Attacking
In LOL world, there is a hero called Teemo and his attacking can make his enemy Ashe be in poisoned ...