Hibernate中利用Criteria进行数据库表数据的增加查询。
Hibernate Session 接口提供了 createCriteria() 方法,可用于创建一个 Criteria 对象,使当您的应用程序执行一个标准查询时返回一个持久化对象的类的实例.
Criteria criteria=session.createCriteria(StudentInfoEntity.class); |
具体步骤(建项目请参考前一篇博文):
a)在src目录下建包,并配置好hibernate.cfg.xml(如图)
b)进入By database Scheam
c)去数据库创建相应表
d)注意如下配置选择
注解名 |
含义 |
@Entity |
被@Entity注解修饰的类,说明这个class是实体类,并且使用默认的orm规则,即class名即数据库表中表名,class字段名即表中的字段名如果想改变这种默认的orm规则,就要使用 |
@Table |
@Table注释指定了Entity所要映射带数据库表,其中@Table.name()用来指定映射表的表名。 如果缺省@Table注释,系统默认采用类名作为映射表的表名。实体Bean的每个实例代表数据表中的一行数据,行中的一列对应实例中的一个属性。
|
@Column |
@Column注释定义了将成员属性映射到关系表中的哪一列和该列的结构信息,属性如下: 1)name:映射的列名。如:映射tbl_user表的name列,可以在name属性的上面或getName方法上面加入; 2)unique:是否唯一; 3)nullable:是否允许为空; 4)length:对于字符型列,length属性指定列的最大字符长度; 5)insertable:是否允许插入; 6)updatetable:是否允许更新; 7)columnDefinition:定义建表时创建此列的DDL; 8)secondaryTable:从表名。如果此列不建在主表上(默认是主表),该属性定义该列所在从表的名字。
|
@Basic |
@Basic表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的getXxxx()方法,默认 即为 @Basic fetch: 表示该属性的读取策略,有EAGER和LAZY两种,分别表示主支抓取和延迟加载,默认为EAGER. (1)、FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载。 (2)、FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。
|
@Id |
@Id 标注用于声明一个实体类的属性映射为数据库的主键列。该属性通常置于属性声明语句之前,可与声明语句同行,也可写在单独行上。@Id标注也可置于属性的getter方法之前。 |
f)创建测试类进行增删改查,增删改都和前一篇博文一样,这里我们介绍一些查询方法
2. 查询条件的限制
可以使用 Criteria 对象可用的 add() 方法去添加一个标准的限制。
//创建一个 Criteria 对象 Criteria criteria=session.createCriteria(StudentInfoEntity.class); //在控制台打印结果集 |
1. 基本查询
根据姓名查询特定学生信息
package com.pojo; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.criterion.Restrictions; import java.util.List; public class queryByCondition { public static void main(String[] args) { //实例化Configuration Configuration config=new Configuration().configure(); //创建会话工厂 SessionFactory sf=config.buildSessionFactory(); //创建会话 Session session=sf.openSession(); //创建一个 Criteria 对象 Criteria criteria=session.createCriteria(StudentInfoEntity.class); //增加查询条件(user_name为“张三”的学生信息) criteria.add(Restrictions.eq("userName","张三")); //得到结果集 List<StudentInfoEntity> list=criteria.list(); //在控制台打印结果集 list.forEach(a-> System.out.println("学生id:"+a.getId()+" 姓名:"+a.getUserName()+" 年龄:"+a.getUserAge()+" 性别:"+a.getUserSex()+" 身高:"+a.getUserHeight())); //关闭会话 session.close(); //关闭会话工厂 sf.close(); } } |
Session session=sf.openSession(); //创建一个 Criteria 对象 Criteria criteria=session.createCriteria(StudentInfoEntity.class); //查询所有学生信息得到结果集 List<StudentInfoEntity> list=criteria.list(); //在控制台打印结果集 list.forEach(a-> System.out.println("学生id:"+a.getId()+" 姓名:"+a.getUserName()+" 年龄:"+a.getUserAge()+" 性别:"+a.getUserSex()+" 身高:"+a.getUserHeight())); |
//创建一个 Criteria 对象 Criteria criteria=session.createCriteria(StudentInfoEntity.class); //增加查询条件(年龄在20-30之间的所有学生信息) //criteria.add(Restrictions.gt("userAge ", 20)).add(Restrictions.lt("userAge ", 30)); criteria.add(Restrictions.between("userAge",new Integer(20),new Integer(30))); //得到结果集 List<StudentInfoEntity> list=criteria.list(); |
//创建一个 Criteria 对象 Criteria criteria=session.createCriteria(StudentInfoEntity.class); //增加查询条件(身高为null的学生信息) criteria.add(Restrictions.isNull("userHeight")); //得到结果集 List<StudentInfoEntity> list=criteria.list(); |
//创建一个 Criteria 对象 Criteria criteria=session.createCriteria(StudentInfoEntity.class); //增加查询条件(年龄等于25或者身高为null的学生对象) criteria.add(Restrictions.or(Restrictions.eq("userAge",new Integer(25)), Restrictions.isNull("userHeight"))); //得到结果集 List<StudentInfoEntity> list=criteria.list(); |
Session session=sf.openSession(); //创建一个 Criteria 对象 Criteria criteria=session.createCriteria(StudentInfoEntity.class); //根据id降序排列 criteria.addOrder(Order.desc("id")); //得到结果集 List<StudentInfoEntity> list=criteria.list(); //在控制台打印结果集 list.forEach(a-> System.out.println("学生id:"+a.getId()+" 姓名:"+a.getUserName()+" 年龄:"+a.getUserAge()+" 性别:"+a.getUserSex()+" 身高:"+a.getUserHeight())); |
//创建一个 Criteria 对象 Criteria criteria=session.createCriteria(StudentInfoEntity.class); //增加查询条件(查询"张三","王五","田七"三人信息) String[] names={"张三","王五","田七"}; criteria.add(Restrictions.in("userName",names)); //得到结果集 List<StudentInfoEntity> list=criteria.list(); |
这里有两种分页标准接口方法:
方法 |
描述 |
public Criteria setFirstResult(int firstResult) |
firstResult属性设置查询起始行 |
public Criteria setMaxResults(int maxResults) |
maxResults 属性设置需要查询的行数。 |
//创建一个 Criteria 对象 Criteria criteria=session.createCriteria(StudentInfoEntity.class); //设置查询起始行 criteria.setFirstResult(0); //设置需要查询的行数 criteria.setMaxResults(5); //得到结果集 List<StudentInfoEntity> list=criteria.list(); |