Hibernate标准查询
一 . 标准查询
1.Hibernate 提供了操纵对象和相应的 RDBMS 表中可用的数据的替代方法。一种方法是标准的 API,它允许你建立一个标准的可编程查询对象来应用过滤规则和逻辑条件。
2.Hibernate Session 接口提供了 createCriteria() 方法,可用于创建一个 Criteria 对象,使当您的应用程序执行一个标准查询时返回一个持久化对象的类的实例。
1.以下是一个最简单的标准查询的例子,它只是简单地返回对应于员工类的每个对象:
Criteria cr = session.createCriteria(Employee.class); List results = cr.list();
2.对标准的限制
你可以使用 Criteria 对象可用的 add() 方法去添加一个标准查询的限制。
2.1以下是一个示例,它实现了添加一个限制,令返回工资等于 2000 的记录:
Criteria cr = session.createCriteria(Emp.class); cr.add(Restrictions.eq("sal", 2000)); List results = cr.list();
2.2以下是几个例子,涵盖了不同的情况,可按要求进行使用:
Criteria cr = session.createCriteria(Employee.class); // 获得超过2000年工资的记录 cr.add(Restrictions.gt("salary", 2000)); // 获得低于2000年工资的记录 cr.add(Restrictions.lt("salary", 2000)); // 在1000到2000年间获得有薪水的记录 cr.add(Restrictions.between("salary", 1000, 2000)); // 检查给定属性是否为空 cr.add(Restrictions.isNull("salary")); // 检查给定属性是否为空 cr.add(Restrictions.isNotNull("salary")); // 检查给定属性是否为空 cr.add(Restrictions.isEmpty("salary")); // 检查给定属性是否为空 cr.add(Restrictions.isNotEmpty("salary"));
二 . 查询演示示例
1.创建hibernate的主配置文件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"> <!-- Generated by MyEclipse Hibernate Tools. --> <hibernate-configuration> <!-- 配置sessionFactory,表示获取连接,包含连接的四要素 注:hibernate 连接的四要素中的名字不能更改,必须是以下的名字 --> <session-factory> <!--方言 告诉hibernate,连接的是oracle数据库 --> <property name="dialect"> org.hibernate.dialect.Oracle9Dialect </property> <property name="connection.url"> jdbc:oracle:thin:local:1521:orcl </property> <property name="connection.username">scott</property> <property name="connection.password">tiger</property> <property name="connection.driver_class"> oracle.jdbc.OracleDriver </property> <!-- 此标签用于是否在控制台输出sql语句 此处ture表示输出 --> <property name="show_sql">true</property> <!--此标签表示引入hiberante的映射文件 --> <!--<mapping resource="cn/et/hibernate/lesson02/query/Emp.hbm.xml" />--> <mapping resource="cn/et/hibernate/lesson02/relation/Dept.hbm.xml" /> <mapping resource="cn/et/hibernate/lesson02/relation/Emp.hbm.xml" /> </session-factory> </hibernate-configuration>
2.创建映射文件,Emp.hbm.xml 和 Dept.hbm.xml
//此映射文集文Emp表的映射文件
<?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"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping> <class name="cn.et.hibernate.lesson02.relation.Emp" table="EMP" schema="SCOTT"> <id name="empno" type="java.lang.Short"> <column name="EMPNO" precision="4" scale="0" /> <generator class="native" /> </id> <!-- many-t-one 表示多对以的关系 Emp表对应Dept表示一对多的关系 模拟查询语句:select * from emp where deptno="其中的一列" --> <many-to-one name="dept" class="cn.et.hibernate.lesson02.relation.Dept" fetch="select"> <column name="DEPTNO" precision="3" scale="0"> <comment>所属部门编号</comment> </column> </many-to-one> <property name="ename" type="java.lang.String"> <column name="ENAME" length="10"> <comment>员工姓名</comment> </column> </property> <property name="job" type="java.lang.String"> <column name="JOB" length="9"> <comment>员工职位</comment> </column> </property> <property name="mgr" type="java.lang.Short"> <column name="MGR" precision="4" scale="0"> <comment>领导编号</comment> </column> </property> <property name="hiredate" type="java.util.Date"> <column name="HIREDATE" length="7"> <comment>雇佣日期</comment> </column> </property> <property name="sal" type="java.lang.Double"> <column name="SAL" precision="7"> <comment>月薪</comment> </column> </property> <property name="comm" type="java.lang.Double"> <column name="COMM" precision="7"> <comment>奖金</comment> </column> </property> </class> </hibernate-mapping>
//此映射文件为Dept表的映射文件
<?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"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping> <class name="cn.et.hibernate.lesson02.relation.Dept" table="DEPT" schema="SCOTT"> <id name="deptno" type="java.lang.Short"> <column name="DEPTNO" precision="3" scale="0" /> <generator class="native" /> </id> <property name="dname" type="java.lang.String"> <column name="DNAME" length="14"> <comment>部门名称</comment> </column> </property> <property name="loc" type="java.lang.String"> <column name="LOC" length="13"> <comment>部门所在位置</comment> </column> </property> <!-- set 中的name 表示实体类中的集合名称 inverse="true" 表示控制反转的意思 --> <set name="emps" inverse="true"> <!-- key 的意思表示将要查询表的主键 当做下一个表的查询条件--> <key> <column name="DEPTNO" precision="3" scale="0"> </column> </key> <!-- 表示一对多的关系,Dept表对Emp表示一对多的关系--> <one-to-many class="cn.et.hibernate.lesson02.relation.Emp" /> </set> </class> </hibernate-mapping>
3.创建测试类,进行查询
package cn.et.hibernate.lesson02.creatiria; import java.math.BigDecimal; import java.util.Iterator; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.LogicalExpression; import org.hibernate.criterion.Restrictions; import org.junit.Test; import cn.et.hibernate.lesson02.relation.Dept; import cn.et.hibernate.lesson02.relation.Emp; //此测试类是直接通过对象的方式进行数据库的增删改查,是hibernate的标准版,无需定义数据库的操作语句 public class TestHibernate { @Test //此方法通过对象的方式进行查询 public void hsqlTest1(){ SessionFactory sf = new Configuration().configure("/cn/et/hibernate/lesson02/hibernate.cfg.xml").buildSessionFactory(); Session session = sf.openSession(); //通过反射的方式获取对象,通过对象进行数据库的操作 Criteria ca = session.createCriteria(Emp.class); //判断是否相等,相当于where条件 select * from emp where ename="ALLEN"; ca.add(Restrictions.eq("ename", "ALLEN")); //返回的是一个list集合 List<Emp> list=ca.list(); Iterator it = list.iterator(); while (it.hasNext()) { Emp e = (Emp) it.next(); System.out.println(e.getEname()); } System.out.println(list.size()); } @Test //该方法是hsl查询中的and连接查询示例 public void hspTest2(){ SessionFactory sf = new Configuration().configure("/cn/et/hibernate/lesson02/hibernate.cfg.xml").buildSessionFactory(); Session session = sf.openSession(); //通过反射的方式获取对象,通过对象进行数据库的操作 Criteria ca = session.createCriteria(Emp.class); //模糊匹配,相当于where条件 select * from emp where ename="ALLEN"; ca.add(Restrictions.like("ename", "%A%")); //判断是否相等,加上上述条件,相当于 select * from emp where ename like "%A%" and sal=1600; ca.add(Restrictions.eq("sal", Double.parseDouble("1600"))); //返回的是一个list集合 List<Emp> list=ca.list(); Iterator it = list.iterator(); while (it.hasNext()) { Emp e = (Emp) it.next(); System.out.println(e.getEname()); } System.out.println(list.size()); } @Test //该方法是hql查询语句中的or语句查询 等价于select * from emp where ename="aa" or ename="bb"; public void hspTest3(){ SessionFactory sf = new Configuration().configure("/cn/et/hibernate/lesson02/hibernate.cfg.xml").buildSessionFactory(); Session session = sf.openSession(); //通过反射的方式获取对象,通过对象进行数据库的操作 Criteria ca = session.createCriteria(Emp.class); //模糊匹配,相当于where条件 select * from emp where ename="ALLEN"; //Criterion 是 Criteria 的查询条件。Criteria 提供了 add(Criterion criterion) 方法来添加查询条件。 Criterion or = Restrictions.or(Restrictions.like("ename", "%A%"),Restrictions.eq("sal", Double.parseDouble("2000"))); //将查询返回的条件添加到Criteria进行查询 ca.add(or); //返回的是一个list集合 List<Emp> list=ca.list(); Iterator it = list.iterator(); while (it.hasNext()) { Emp e = (Emp) it.next(); System.out.println(e.getEname()); } System.out.println(list.size()); } }