Hibernate(八)
三套查询之Criteria查询
完全面向对象的,不需要写任可查询语句.
1.查询所有的学生
//1.查询所有的学生
@Test
public void test1(){
Criteria criteria = session.createCriteria(Student.class);
List<Student> list = criteria.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName());
} Criteria criteria2 = session.createCriteria("com.rong.entity.group.Student");
List<Student> list2 = criteria2.list();
for (Student student : list2) {
System.out.println(student.getId()+student.getName());
}
}
2.添加查询条件
add(Criterion criterion) : 添加查询条件.
Criterion : 代表一个查询条件.
Restrictions工具类,专门负责生成查询条件对象,它把where部分都改成了静态方法。
sqlRestriction(String sql) : 生成查询条件的万能方法.
Property工具类,专门负责生成查询条件对象.
Propery.forName("属性名").xxx()
//2.添加查询条件
@Test
public void test2(){
//1.添加一个
Criteria criteria = session.createCriteria(Student.class);
criteria=criteria.add(Restrictions.like("name", "%ab%"));
List<Student> list = criteria.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName());
}
//2.添加多个
Criteria criteria2 = session.createCriteria(Student.class);
criteria2.add(Restrictions.like("name", "%a%"));
criteria2.add(Restrictions.between("java", 60, 100));
List<Student> list2 = criteria2.list();
for (Student student : list2) {
System.out.println(student.getId()+student.getName());
}
System.out.println("===================================");
Criteria criteria3 = session.createCriteria(Student.class);
criteria3.add(Property.forName("name").like("%p%"));
criteria3.add(Property.forName("math").between(85, 100));
List<Student> list3 = criteria3.list();
for (Student student : list3) {
System.out.println(student.getId()+student.getName()
+student.getMath());
}
}
3.添加自己的sql
//3.添加自己的sql
@Test
public void test3(){
Criteria criteria = session.createCriteria(Student.class);
criteria.add(Restrictions.sqlRestriction("length(name)>4 and name like '%a%'"));
List<Student> list = criteria.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName());
}
}
4.排序
addOrder(Order order) : 添加排序.
Order.asc("属性名") | Order.desc("属性名")
Property.forName("age").asc()|Property.forName("age").desc()
//4.排序
@Test
public void test4(){
//第一种方式
Criteria criteria = session.createCriteria(Student.class);
criteria.add(Restrictions.lt("id", 10));
criteria.addOrder(Order.asc("java"));//升序
List<Student> list = criteria.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getJava());
}
Criteria criteria2 = session.createCriteria(Student.class);
criteria2.add(Restrictions.gt("id", 90));
criteria2.addOrder(Order.desc("math"));//降序
List<Student> list2 = criteria2.list();
for (Student student : list2) {
System.out.println(student.getId()+student.getName()+student.getMath());
}
//第二种方式
Criteria criteria3 = session.createCriteria(Student.class);
List<Student> list3 = criteria3.addOrder(Property.forName("java").asc()).list();
for (Student student : list3) {
System.out.println(student.getId()+student.getName()+student.getJava());
}
Criteria criteria4 = session.createCriteria(Student.class);
List<Student> list4 = criteria4.addOrder(Property.forName("java").desc()).list();
for (Student student : list4) {
System.out.println(student.getId()+student.getName()+student.getJava());
}
}
5.查询一列
setProjection(Projection projection): 查询哪些列.
Projection : 代表一列
ProjectionList : 代表多列
Projections : 专门创建Projection | ProjectionList
//5.查询一列
@Test
public void test5(){
Criteria criteria = session.createCriteria(Student.class);
criteria.setProjection(Projections.property("name"));
List<String> list = criteria.list();
for (String string : list) {
System.out.println(string);
}
}
6.查询多列
//6.查询多列
@Test
public void test6(){
Criteria criteria = session.createCriteria(Student.class);
ProjectionList pl = Projections.projectionList();
pl.add(Projections.property("java"));
pl.add(Projections.property("math"));
criteria.setProjection(pl);
//criteria.setProjection(Projections.projectionList().add(Projections.property("java"))
// .add(Projections.property("math")));
List<Object[]> list = criteria.list();
for (Object[] objects : list) {
for (Object object : objects) {
System.out.print(object+"\t");
}
System.out.println();
}
}
7.聚集函数
//7.聚集函数
@Test
public void test7(){
Criteria criteria = session.createCriteria(Student.class);
criteria.setProjection(Projections.rowCount());
criteria.add(Restrictions.between("id", 10, 20));
Object rowCount = criteria.uniqueResult();
System.out.println("id在10到20之间的数量为:"+rowCount);
Criteria criteria2 = session.createCriteria(Student.class);
criteria2.setProjection(Projections.sum("java"));
criteria2.add(Property.forName("id").between(1, 3));
Object sum = criteria2.uniqueResult();
System.out.println("id为1到3的java成绩总和为:"+sum);
}
8.分组
//8.分组
@Test
public void test8(){
Criteria criteria = session.createCriteria(Student.class);
criteria.setProjection(Projections.projectionList().add(Projections.rowCount()).add(Projections.groupProperty("teacher.id")));
List<Object[]> list = criteria.list();
for (Object[] objects : list) {
for (Object object : objects) {
System.out.println(object);
}
}
}
9.通过老师id查询学生(使用别名查询)
setFetchMode(String associationPath, FetchMode mode): 抓取连接(join fetch)
FetchMode: 抓取模式
FetchMode.JOIN FetchMode.EAGER 立即查询
FetchMode.SELECT FetchMode.LAZY 延迟查询
//9.通过老师id查询学生(使用别名查询)
@Test
public void test9(){
Criteria criteria = session.createCriteria(Student.class);
criteria.add(Restrictions.eq("teacher.tid", 1));
List<Student> list = criteria.list();
for (Student student : list) {
System.out.println(student.getName()+student.getTeacher().getTid());
}
System.out.println("=============以下是通过别名查询================");
Criteria criteria2 = session.createCriteria(Student.class);
criteria2.createAlias("teacher", "t");
criteria2.add(Restrictions.eq("t.id", 1));
List<Student> list2 = criteria2.list();
for (Student student : list2) {
System.out.println(student.getName()+student.getTeacher().getTid());
}
}
//setFetchMode: 抓取延迟的属性
Criteria criteria3 = session.createCriteria(Student.class);
criteria3.setFetchMode("teacher", FetchMode.JOIN);
List<Student> list3 = criteria3.list();
/*for (Student student : list3) {
System.out.println(student.getName()+student.getTeacher().getTid());
}*/
10.离线查询
离线查询 DetachedCriteria.
DetachedCriteria :用它就可以定义一条查询语句. select * from stu_info.
用得时候需要与Session关联起来.
离线查询的主要作用就是为了做子查询. in 、not in(离线查询对象)
//10.离线查询
@Test
public void test10(){
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Student.class);
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
List<Student> list = criteria.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName());
}
}
11.子查询
//11.子查询
@Test
public void test11(){
Criteria criteria = session.createCriteria(Student.class);
criteria.add(Restrictions.in("id", new Object[]{1,2,3}));
List<Student> list = criteria.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName());
}
System.out.println("==================================");
//离线查询作为子查询的一部分
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Student.class);
detachedCriteria.setProjection(Projections.property("id"));
detachedCriteria.add(Restrictions.between("id", 60, 90));
Criteria criteria2 = session.createCriteria(Student.class);
criteria2.add(Property.forName("id").in(detachedCriteria));
List<Student> list2 = criteria2.list();
for (Student student : list2) {
System.out.println(student.getId()+student.getName());
}
}
Hibernate(八)的更多相关文章
- hibernate(八) Hibernate检索策略(类级别,关联级别,批量检索)详解
序言 很多看起来很难的东西其实并不难,关键是看自己是否花费了时间和精力去看,如果一个东西你能看得懂,同样的,别人也能看得懂,体现不出和别人的差距,所以当你觉得自己看了很多书或者学了很多东西的时候,你要 ...
- Hibernate(八)__级联操作、struts+hibernate+接口编程架构
级联操作 所谓级联操作就是说,当你进行主对象某个操作时,从对象hibernate自动完成相应操作. 比如: Department <---->Student 对象关系,我希望当我删除一个d ...
- Hibernate(八)多对多映射
一.创建数据表 --学生证表 create table paper ( pid number primary key, pdesc ) , sid number references student( ...
- Hibernate(八)--session的两种获取方式
openSession getCurrentSession Hibernate有两种方式获得session,分别是: openSession和getCurrentSession他们的区别在于1. 获取 ...
- 八步详解Hibernate的搭建及使用
本文通过了八个步骤以及一些实例添加用户来介绍Hibernate的搭建和使用,真切的介绍了hibernate的基本用法,其中好多优点等待我们自己去发现,比如hibernate中的缓存机制,映射方案. 1 ...
- (Hibernate进阶)Hibernate映射——多对多关联映射(八)
多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数 ...
- [Java面试八]Hibernate总结以及在面试中的一些问题.
1.为什么要使用Hibernate开发你的项目呢?Hibernate的开发流程是怎么样的? 为什么要使用 ①.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码. ②.Hiber ...
- hibernate(八)一对多关联
一.一对多单向关良 一对多单向关联与多对一相似 假设一个组有多个用户,即一(Group)对多(User) 需要在Group类中添加一个User类的Set集合(数据库中的用户不可能是重复的,所以要用Se ...
- HIbernate的基本包——八个,详细条目
antlr-2.7.6commons-collections-3.1dom4j-1.6.1hibernate3javassist-3.9.0.GAjta-1.1slf4j-api-1.5.8slf4j ...
- 攻城狮在路上(壹) Hibernate(十八)--- 管理Hibernate的缓存
一般Session的缓存被称为Hibernate的第一级缓存,SessionFactory的外置缓存是一个可配置的缓存插件,称为Hibernate的第二级缓存.一.缓存的基本原理: 1.持久化层的缓存 ...
随机推荐
- STM32(5)——通用定时器基本定时器
1.STM32的Timer简介 STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器. 其中系统嘀嗒定时器是前文中所描述的S ...
- CTF-安恒19年二月月赛部分writeup
CTF-安恒19年二月月赛部分writeup MISC1-来玩个游戏吧 题目: 第一关,一眼可以看出是盲文,之前做过类似题目 拿到在线网站解一下 ??41402abc4b2a76b9719d91101 ...
- 中国大学MOOC-JAVA学习(浙大翁恺)—— 温度转换
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto- ...
- Vue2.5入门-1
vue如何引用和使用,实例和挂在点的介绍 <!DOCTYPE html> <html> <head> <title>vue 入门</title&g ...
- Go语言反射之类型反射
1 概述 类似于 Java,Go 语言也支持反射.支持反射的语言可以在运行时对程序进行访问和修改.反射的原理是在程序编译期将反射信息(如类型信息.结构体信息等)整合到程序中,并给提供给程序访问反射信息 ...
- python中Excel表操作
python中关于excel表个的操作 使用 python中的xlwt和xlrd模块进行操作 # 2003之前:Excel:xls# 2003之后:Excel:xlsx# xlrd:读取的模块:xls ...
- Flex 网络图
这个是最简单的网络拓扑图开发,我已经帮你把所有拓扑元素封装好,然后直接添加就会具有相关的特性.并且的底层元素也开源,也方便大家oem修改.只需10分钟就可以建设一个完善的拓扑图. 首先下载工程或者SW ...
- linux内存碎片的概念
一般在内核术语中的“碎片”都是基于物理内存而言的,我没有太看懂你得出碎片是针对地址空间这个结论的逻辑.但我认为,既然你知道了malloc是用户空间调用的,那么你所谓的碎片也是从用户空间的视角而言的,但 ...
- WPF RoutedEvent and HitTest - 简书
原文:WPF RoutedEvent and HitTest - 简书 学习的时候切忌心浮气躁,慢慢的过每一个知识点,不要漏掉任何细节.不然当遇到细节问题的时候,会恼,会闹,会悔不该当初--花一下午调 ...
- 【转载】DXUT11框架浅析(4)--调试相关
原文:DXUT11框架浅析(4)--调试相关 DXUT11框架浅析(4)--调试相关 1. D3D8/9和D3D10/11的调试区别 只要安装了DXSDK,有个调试工具DirectX ControlP ...