Hibernate(十二)Criteria查询
一、简述
Criteria是一种比hql更面向对象的查询方式。Criteria 可使用 Criterion 和 Projection 设置查询条件。可以设置 FetchMode(联合查询抓取的模式 ) ,设置排序方式,Criteria 还可以设置 FlushModel (冲刷 Session 的方式)和 LockMode (数据库锁模式)。
Criteria本身只是查询的容器。Criteria查询又称对象查询
Criteria查询采用面向对象的方式封装查询条件。由Hibernater自动生成SQL查询语句
二、不带查询条件
建立数据表
create table login
(
username varchar2(32) primary key,
password varchar2(32) not null ,
age number(3)
); insert into login
select '张三','',21 from dual union
select 'Tom','',34 from dual union
select 'Jack','',34 from dual union
select '李四','qwerty',23 from dual;
commit;
建立持久化类和配置文件
Hibernate.cfg.xml配置文件
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration> <session-factory>
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:orcl
</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">
oracle.jdbc.OracleDriver
</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property> <mapping resource="entity/Login.hbm.xml" /> </session-factory> </hibernate-configuration>
持久化类和配置文件
package entity; public class Login implements java.io.Serializable { // Fields /**
*
*/
private static final long serialVersionUID = 1L;
private String username;
private String password;
private int age; // Constructors /** default constructor */
public Login() {
} /** minimal constructor */
public Login(String username, String password) {
this.username = username;
this.password = password;
} /** full constructor */
public Login(String username, String password, int age) {
this.username = username;
this.password = password;
this.age = age;
} // Property accessors public String getUsername() {
return this.username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return this.password;
} public void setPassword(String password) {
this.password = password;
} public int getAge() {
return this.age;
} public void setAge(int age) {
this.age = age;
} }
配置文件Login.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<class name="entity.Login" table="LOGIN" schema="ROOT">
<id name="username" type="java.lang.String">
<column name="USERNAME" length="32" />
<generator class="assigned" />
</id>
<property name="password" type="java.lang.String">
<column name="PASSWORD" length="32" not-null="true" />
</property>
<property name="age" type="java.lang.Integer">
<column name="AGE" precision="3" scale="0" />
</property>
</class>
</hibernate-mapping>
测试类:
package demo; import java.util.List; import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import entity.Login; public class Demo1 { /**
* Criteria无查询条件查询所有
*/
public static void main(String[] args) {
//声明一个集合用来接收结果
List<Login> result=null;
//声明SessionFactory
SessionFactory factory=null;
//声明Session
Session session=null;
//初始化以上对象
try{
factory=new Configuration().configure().buildSessionFactory();
session=factory.openSession();
//声明Criteria对象传入一个持久化类对象类型
Criteria criteria=session.createCriteria(Login.class);
//查询使用list方法
result=criteria.list();
}catch(HibernateException e){
e.printStackTrace();
}finally{
session.close();
factory.close();
}
//输出结果
for (Login login : result) {
System.out.println("用户名:"+login.getUsername()+" 密码:"+login.getPassword()+" 年龄:"+login.getAge());
} } }
结果:
Hibernate:
select
this_.USERNAME as USERNAME0_0_,
this_.PASSWORD as PASSWORD0_0_,
this_.AGE as AGE0_0_
from
ROOT.LOGIN this_
用户名:Jack 密码:12345678 年龄:34
用户名:Tom 密码:123123 年龄:34
用户名:李四 密码:qwerty 年龄:23
用户名:张三 密码:123456 年龄:21
三、添加查询条件
3.1、加入一个username的条件
//声明Criteria对象传入一个持久化类对象类型
Criteria criteria=session.createCriteria(Login.class);
//添加查询条件 Restrictions.eq是等于的意思,2个参数,第一个为持久化类的属性,第2个为比较的参数值 criteria.add(Restrictions.eq("username", "Tom"));
//查询使用list方法
result=criteria.list();
执行的SQL
select
this_.USERNAME as USERNAME0_0_,
this_.PASSWORD as PASSWORD0_0_,
this_.AGE as AGE0_0_
from
ROOT.LOGIN this_
where
this_.USERNAME=?
3.2、多个查询条件AND--between
//年龄在大于等于25
criteria.add(Restrictions.le("age", 25));
//年龄小于等于23
criteria.add(Restrictions.ge("age", 23));
或者
//年年龄大于23小于25之间的记录
criteria.add(Restrictions.between("age", 23, 25));
执行的SQL
select
this_.USERNAME as USERNAME0_0_,
this_.PASSWORD as PASSWORD0_0_,
this_.AGE as AGE0_0_
from
ROOT.LOGIN this_
where
this_.AGE<=?
and this_.AGE>=?
select
this_.USERNAME as USERNAME0_0_,
this_.PASSWORD as PASSWORD0_0_,
this_.AGE as AGE0_0_
from
ROOT.LOGIN this_
where
this_.AGE between ? and ?
3.3、多个查询条件或者条件 or
criteria.add(Restrictions.or(Restrictions.eq("age", 23), Restrictions.like("username", "%李%")));
//或者以下写法直接使用SQL语句
criteria.add(Restrictions.sqlRestriction("age=20 or username like '%李%'"));
执行SQL
select
this_.USERNAME as USERNAME0_0_,
this_.PASSWORD as PASSWORD0_0_,
this_.AGE as AGE0_0_
from
ROOT.LOGIN this_
where
(
this_.AGE=?
or this_.USERNAME like ?
)
直接使用SQL的执行语句
select
this_.USERNAME as USERNAME0_0_,
this_.PASSWORD as PASSWORD0_0_,
this_.AGE as AGE0_0_
from
ROOT.LOGIN this_
where
age=20
or username like '%李%'
四、Restrictions常用方法
五、常用方法使用
package demo; import java.util.List; import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions; import entity.Login; public class Demo1 { /**
* Criteria无查询条件查询所有
*/
public static void main(String[] args) {
//声明一个集合用来接收结果
List<Login> result=null;
//声明SessionFactory
SessionFactory factory=null;
//声明Session
Session session=null;
//初始化以上对象
try{
factory=new Configuration().configure().buildSessionFactory();
session=factory.openSession();
//声明Criteria对象传入一个持久化类对象类型
Criteria criteria=session.createCriteria(Login.class);
//1.查询用户名为Tom的记录
//criteria.add(Restrictions.eq("username", "Tom"));
//2.查询年龄大于等于21同时小于等于25的记录
//criteria.add(Restrictions.ge("age", 21));
//criteria.add(Restrictions.le("age", 25));
//between写法
//criteria.add(Restrictions.between("age", 21, 25));
//3.或者查询年龄=21或者名字中有李的记录
//criteria.add(Restrictions.or(Restrictions.eq("age", 21), Restrictions.like("username", "%李%")));
//sql写法
//criteria.add(Restrictions.sqlRestriction("age=21 or username like '%李%'"));
//4.年龄在21,23,25的记录
//criteria.add(Restrictions.in("age", new Integer []{21,23,25}));
//5.and用法
criteria.add(Restrictions.and(Restrictions.ge("age", 23), Restrictions.like("username", "%T%"))); //查询使用list方法
result=criteria.list();
}catch(HibernateException e){
e.printStackTrace();
}finally{
session.close();
factory.close();
}
System.out.println("==========");
//输出结果
for (Login login : result) {
System.out.println("用户名:"+login.getUsername()+" 密码:"+login.getPassword()+" 年龄:"+login.getAge());
} } }
六、对结果进行排序
使用Order关键字,进行排序
criteria.addOrder(Order.desc(属性名称));降序
criteria.addOrder(Order.asc(属性名称));升序
//按年龄降序排序
criteria.addOrder(Order.desc("age"));
//按姓名升序排序
criteria.addOrder(Order.asc("username"));
//查询使用list方法
result=criteria.list();
//输出结果
for (Login login : result) {
System.out.println("用户名:"+login.getUsername()+" 密码:"+login.getPassword()+" 年龄:"+login.getAge());
}
七、示例查询
package demo; import java.util.List; import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions; import entity.Login; public class Demo2 { /**
* Criteria无查询条件查询所有
*/
public static void main(String[] args) {
//声明一个集合用来接收结果
List<Login> result=null;
//声明SessionFactory
SessionFactory factory=null;
//声明Session
Session session=null;
//声明一个Login对象,并赋值可以是多个 但不能是主键
Login user=new Login();
user.setAge(21); //初始化以上对象
try{
factory=new Configuration().configure().buildSessionFactory();
session=factory.openSession();
//声明Criteria对象传入一个持久化类对象类型
Criteria criteria=session.createCriteria(Login.class);
//加入查询条件
criteria.add(Example.create(user)); //查询使用list方法
result=criteria.list();
}catch(HibernateException e){
e.printStackTrace();
}finally{
session.close();
factory.close();
}
System.out.println("==========");
//输出结果
for (Login login : result) {
System.out.println("用户名:"+login.getUsername()+" 密码:"+login.getPassword()+" 年龄:"+login.getAge());
} } }
八、聚合函数
package demo; import java.util.Iterator;
import java.util.List; import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections; import entity.Login; public class Demo3 { /**
* Criteria无查询条件查询所有
*/
public static void main(String[] args) {
//声明一个集合用来接收结果
List<Login> result=null;
//声明SessionFactory
SessionFactory factory=null;
//声明Session
Session session=null; //初始化以上对象
try{
factory=new Configuration().configure().buildSessionFactory();
session=factory.openSession();
//声明Criteria对象传入一个持久化类对象类型
Criteria criteria=session.createCriteria(Login.class);
//加入查询条件
//总记录数
//criteria.setProjection(Projections.rowCount());
//平均年龄
//criteria.setProjection(Projections.avg("age"));
//分组
criteria.setProjection(Projections.groupProperty("username"));
//查询使用list方法
result=criteria.list();
//System.out.println("平均年龄:"+result.iterator().next());
//System.out.println("总记录数:"+result.iterator().next());
Iterator iterator=result.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}catch(HibernateException e){
e.printStackTrace();
}finally{
session.close();
factory.close();
} } }
分页
package demo; import java.util.List; import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions; import entity.Login; public class Demo4 { /**
* Criteria无查询条件查询所有
*/
public static void main(String[] args) {
//声明一个集合用来接收结果
List<Login> result=null;
//声明SessionFactory
SessionFactory factory=null;
//声明Session
Session session=null;
//当前页数第几页
int pageIndex=1;
//最大显示记录数
int pageSize=2;
//初始化以上对象
try{
factory=new Configuration().configure().buildSessionFactory();
session=factory.openSession();
//声明Criteria对象传入一个持久化类对象类型
Criteria criteria=session.createCriteria(Login.class);
//起始记录数
criteria.setFirstResult((pageIndex-1)*pageSize);
//每页显示最大记录数
criteria.setMaxResults(pageSize); //查询使用list方法
result=criteria.list();
}catch(HibernateException e){
e.printStackTrace();
}finally{
session.close();
factory.close();
}
System.out.println("==========");
//输出结果
for (Login login : result) {
System.out.println("用户名:"+login.getUsername()+" 密码:"+login.getPassword()+" 年龄:"+login.getAge());
} } }
Hibernate(十二)Criteria查询的更多相关文章
- Hibernate-ORM:15.Hibernate中的Criteria查询
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲师Hibernate中的Criteria查询! 一,Criteria简介: 刚接触Hibernate ...
- (十二)数据库查询处理之Query Execution(1)
(十二)数据库查询处理之Query Execution(1) 1. 写在前面 这一大部分就是为了Lab3做准备的 每一个query plan都要实现一个next函数和一个init函数 对于next函数 ...
- Hibernate框架之Criteria查询 和注解(重点☆☆☆☆☆,难点☆☆☆)
写好一篇博客,不是容易的事.原因是:你要给自己以后看的时候,还能看懂,最重要的是当别人看到你的博客文章的时候,也一样很清楚的明白你自己写的东西.其实这也是一种成就感!! 对于每一个知识点,要有必要的解 ...
- Hibernate框架之Criteria查询
首先给大家说说Hibernate检索方式 Hibernate提供了5种检索对象的方式 1.导航对象图检索方式:根据已经加载的对象导航到其他对象 2.OID检索方式:按照对象的OID来检索对象 3.HQ ...
- Hibernate中使用Criteria查询
忽略一些配置,测试代码如下: Session session= HibernateUtil.getSession(); Transaction tx= session.beginTransaction ...
- 跟我一起读postgresql源码(十二)——Executor(查询执行模块之——Materialization节点(下))
接前文,我们继续说剩下的4个Materialization节点. 7.SetOp节点 SetOp节点用于处理集合操作,对应于SQL语句中的EXCEPT.INTERSECT两种集合操作,至于另一种集合操 ...
- oracle学习笔记(十二) 查询练习(二) 高级查询
高级查询练习 /*--------------------------------------------- 分组查询 -------------------------------------*/ ...
- Hibernate框架之Criteria 详解
自从学数据库以来,从SQL查询-HQL查询-到Criteria 查询.有人问我:掌握一种查询语句不就可以吗,为什么还要学Criteria 查询?我回答道:用到特定于数据库的SQL 语句,程序本身会依赖 ...
- 50个SQL语句(MySQL版) 问题十二
--------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ...
随机推荐
- 前些日子用css画的大白
闲来无事用css画的一个大白...其实有一些地方偷懒了用svg去画的,因为用纯几何形状组合去画变化那么复杂的曲线不太现实.但svg曲线坐标还是自己一点点调出来的,没有用工具生成. ps:点击身体的某些 ...
- TransactionScope只要一个操作失败,它会自动回滚,Complete表示事务完成
实事上,一个错误的理解就是Complete()方法是提交事务的,这是错误的,事实上,它的作用的表示本事务完成,它一般放在try{}的结尾处,不用判断前台操作是否成功,如果不成功,它会自己回滚. #re ...
- VC6 下 libpng 库的编译与初步使用
VC6 下 libpng 库的编译与初步使用 目录 libong 库的介绍 VC6 下 libpng 的编译 下载 libpng 与 zlib 进行编译 得到 .lib 文件 初步使用 对 VC6 ...
- 机器学习实战:用nodejs实现人脸识别
机器学习实战:用nodejs实现人脸识别 在本文中,我将向你展示如何使用face-recognition.js执行可靠的人脸检测和识别 . 我曾经试图找一个能够精确识别人脸的Node.js库,但是 ...
- 用户组篇endgrent getpw getuid
endgrent(关闭组文件) 相关函数 getgrent,setgrent 表头文件 #include<grp.h> #include<sys/types.h> 定义函数 v ...
- 文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write
文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write close(关闭文件) 相关函数 ope ...
- 语义后承(semantic consequence),句法后承(syntactic consequence),实质蕴含(material implication / material conditional)
作者:罗心澄链接:https://www.zhihu.com/question/21191299/answer/17469774来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- 基尼系数(Gini coefficient),洛伦茨系数
20世纪初意大利经济学家基尼,于1922年提出的定量测定收入分配差异程度的指标.它是根据洛伦茨曲线找出了判断分配平等程度的指标(如下图). 设实际收入分配曲线和收入分配绝对平等曲线之间的面积为A,实际 ...
- UI_UITabBarController
建立控制器 // 普通控制器 GroupViewController *groupVC = [[GroupViewController alloc] init]; SecondViewControll ...
- Paint、Canvas、Matrix使用解说(一、Paint)
username=tianjian4592">我正在參加 CSDN 2015博客之星评选 感恩分享活动,假设认为文章还不错,请投个票鼓舞下吧:http://vote.blog.csdn ...