hibernate检索方式与检索策略
一、打开oracle登录scott账户,查询emp表的全部数据
二、打开MyEclipse,创建一个java项目为hibernate_retrieval,添加包、hibernate配置文件、hibernate映射文件
三、测试hibernate的检索方式与检索策略
1.主方法
public static void main(String[] args) {
// t1();//通过"FROM Emp"HQL语句查询scott账户下emp表的全部数据
// t2();//通过"SELECT e FROM Emp e"HQL语句查询scott账户下emp表的全部数据
// t3();//通过"SELECT e FROM Emp e WHERE e.comm IS NULL"HQL语句查询scott账户下emp表comm为空的全部数据
// t4();//通过HQL语句查询emp表的全部数据,并且sal,empno降序排列
// t5();//查询emp表中job为CLERK,deptno为20的全部员工,且sal,empno降序排列
// t6();//查询emp表中ename第三个字符为'O'的员工
// t7();//查询emp表中ename第二个字符为'O'的所有员工
// t8();//查询emp表中ename第二个字符为'O'的所有员工,且sal>2999.0(按参数位置绑定)
// t9();//查询emp表中ename第二个字符为'O'的所有员工,且sal>2999.0(按参数名字绑定)
// t10();//通过HQL投影查询emp表中的ename(将每条查询结果封装成Object对象)
// t11();//通过HQL投影查询emp表中的ename,job(将每条查询结果封装成Object数组)
t12();//通过HQL投影查询emp表中的ename,job(将每条查询结果通过构造函数封装成对象)
}
2.测试方法一
/**
* 通过"FROM Emp"HQL语句查询scott账户下emp表的全部数据<br/>
* 执行HQL语句的步骤:<br/>
* 1. 获取Session对象<br/>
* 2. 编写HQL语句;<br/>
* 3. 创建Query对象;<br/>
* 4. 执行查询,得到查询结果<br/>
*/
private static void t1() {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
String hql = "FROM Emp";
Query query = session.createQuery(hql);
List<Emp> list = query.list();
for (Emp e : list) {
System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
+ e.getSal());
}
transaction.commit();
session.close();
sessionFactory.close();
}
运行:
3.测试方法二
/**
* 通过"SELECT e FROM Emp e"HQL语句查询scott账户下emp表的全部数据 <br/>
* 执行HQL 语句的步骤:<br/>
* 1. 获取Session对象<br/>
* 2. 编写HQL语句;<br/>
* 3. 创建Query对象;<br/>
* 4. 执行查询,得到查询结果<br/>
*/
private static void t2() {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
String hql = "SELECT e FROM Emp e";
Query query = session.createQuery(hql);
List<Emp> list = query.list();
for (Emp e : list) {
System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
+ e.getSal());
}
transaction.commit();
session.close();
sessionFactory.close();
}
运行:
4.测试方法三
/**
* 通过"SELECT e FROM Emp e WHERE e.comm IS NULL"HQL语句查询scott账户下emp表comm为空的全部数据 <br/>
* 执行HQL 语句的步骤:<br/>
* 1. 获取Session对象<br/>
* 2. 编写HQL语句;<br/>
* 3. 创建Query对象;<br/>
* 4. 执行查询,得到查询结果<br/>
*/
private static void t3() {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
String hql = "SELECT e FROM Emp e WHERE e.comm IS NULL";
Query query = session.createQuery(hql);
List<Emp> list = query.list();
for (Emp e : list) {
System.out.println(e.getEmpno() + "\t\t" + e.getComm());
}
transaction.commit();
session.close();
sessionFactory.close();
}
运行:
5.测试方法四
/**
* 通过HQL语句查询emp表的全部数据,并且sal,empno降序排列
*/
private static void t4() {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
String hql = "SELECT e FROM Emp e ORDER BY e.sal DESC,e.empno DESC";
Query query = session.createQuery(hql);
List<Emp> list = query.list();
for (Emp e : list) {
System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
+ e.getSal());
}
transaction.commit();
session.close();
sessionFactory.close();
}
运行:
6.测试方法五
/**
* 查询emp表中job为CLERK,deptno为20的全部员工,且sal,empno降序排列
*/
private static void t5() {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
String hql = "SELECT e FROM Emp e WHERE e.job='CLERK' AND e.dept.deptno=20 ORDER BY e.sal DESC,e.empno DESC";
Query query = session.createQuery(hql);
List<Emp> list = query.list();
for (Emp e : list) {
System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
+ e.getSal());
}
transaction.commit();
session.close();
sessionFactory.close();
}
运行:
7.测试方法六
/**
* 查询emp表中ename第三个字符为'O'所有的员工
*/
private static void t6() {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
String hql = "SELECT e FROM Emp e WHERE e.ename LIKE '__O%'";
Query query = session.createQuery(hql);
List<Emp> list = query.list();
for (Emp e : list) {
System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
+ e.getJob() + "\t\t" + e.getSal() + "\t\t" + e.getComm());
}
transaction.commit();
session.close();
sessionFactory.close();
}
运行:
8.测试方法七
/**
* 查询emp表中ename第二个字符为'O'的所有员工<br/>
* 在HQL查询语句中绑定参数<br/>
* 方法一:按参数位置绑定<br/>
*/
private static void t7() {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
String hql = "SELECT e FROM Emp e WHERE e.ename LIKE ?";
Query query = session.createQuery(hql);
query.setString(0, "_O%");
List<Emp> list = query.list();
for (Emp e : list) {
System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
+ e.getJob() + "\t\t" + e.getSal() + "\t\t" + e.getComm());
}
transaction.commit();
session.close();
sessionFactory.close();
}
运行:
9.测试方法八
/**
* 查询emp表中ename第二个字符为'O'的所有员工,且sal>2999.0<br/>
* 在HQL查询语句中绑定参数<br/>
* 方法一:按参数位置绑定<br/>
*/
private static void t8() {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
String hql = "SELECT e FROM Emp e WHERE e.ename LIKE ? AND e.sal > ?";
Query query = session.createQuery(hql);
query.setString(0, "_O%");
// query.setDouble(1, 2999.0);
query.setString(1, "2999.0");
List<Emp> list = query.list();
for (Emp e : list) {
System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
+ e.getJob() + "\t\t" + e.getSal() + "\t\t" + e.getComm());
}
transaction.commit();
session.close();
sessionFactory.close();
}
运行:
10.测试方法九
/**
* 查询emp表中ename第二个字符为'O'的所有员工,且sal>2999.0<br/>
* 在HQL查询语句中绑定参数<br/>
* 方法二:按参数名字绑定<br/>
*/
private static void t9() {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
String hql = "SELECT e FROM Emp e WHERE e.ename LIKE :n AND e.sal > :s";
Query query = session.createQuery(hql);
query.setString("n", "_O%");
// query.setDouble("s", 2999.0);
query.setString("s", "2999.0");
List<Emp> list = query.list();
for (Emp e : list) {
System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
+ e.getJob() + "\t\t" + e.getSal() + "\t\t" + e.getComm());
}
transaction.commit();
session.close();
sessionFactory.close();
}
运行:
11.测试方法十
/**
* 通过HQL投影查询emp表中的ename(将每条查询结果封装成Object对象)<br/>
*
* HQL投影查询是查询一个持久化类的一个或多个属性值<br/>
* 将每条查询结果封装成Object对象<br/>
* 将每条查询结果封装成Object数组<br/>
* 将每条查询结果通过构造函数封装成对象<br/>
*/
private static void t10() {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
String hql = "SELECT e.ename FROM Emp e";
Query query = session.createQuery(hql);
List<String> list = query.list();
for (String ename : list) {
System.out.println(ename);
}
transaction.commit();
session.close();
sessionFactory.close();
}
运行:
12.测试方法十一
/**
* 通过HQL投影查询emp表中的ename,job(将每条查询结果封装成Object数组)<br/>
*
* HQL投影查询是查询一个持久化类的一个或多个属性值<br/>
* 将每条查询结果封装成Object对象<br/>
* 将每条查询结果封装成Object数组<br/>
* 将每条查询结果通过构造函数封装成对象<br/>
*/
private static void t11() {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
String hql = "SELECT e.ename,e.job FROM Emp e";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for (Object[] obj : list) {
System.out.println(obj[0]+"\t\t"+obj[1]);
}
transaction.commit();
session.close();
sessionFactory.close();
}
运行:
13.测试方法十二
/**
* 通过HQL投影查询emp表中的ename,job(将每条查询结果通过构造函数封装成对象)<br/>
*
* HQL投影查询是查询一个持久化类的一个或多个属性值<br/>
* 将每条查询结果封装成Object对象<br/>
* 将每条查询结果封装成Object数组<br/>
* 将每条查询结果通过构造函数封装成对象<br/>
*/
private static void t12() {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
//使用new Emp(e.ename,e.job)时,需要在Emp类中重写构造方法,方法中含有ename,job这两个参数
String hql = "SELECT new Emp(e.ename,e.job) FROM Emp e";
Query query = session.createQuery(hql);
List<Emp> list = query.list();
for (Emp e : list) {
System.out.println(e.getEname() + "\t\t" + e.getJob()
+ "\t\t" + e.getSal());//e.getSal在投影查询ename,job的情况下为空
}
transaction.commit();
session.close();
sessionFactory.close();
}
运行:
四、小结
HQL(Hibernate Query Language)是面向对象的查询语句
执行HQL语句的步骤:
- 获取Session对象
- 编写HQL语句;
- 创建Query对象;
- 执行查询,得到查询结果
HQL语句中绑定参数的形式有两种:
按参数位置绑定
按参数名字绑定
HQL投影查询是查询一个持久化类的一个或多个属性值
将每条查询结果封装成Object对象
将每条查询结果封装成Object数组
将每条查询结果通过构造函数封装成对象
HQL支持投影查询、参数查询、分页查询等功能。
ok,告一段落了,还有分页查询没有演示,我准备以后单独测试分页查询,所以就没有写。
好了,休息了^_^
还没有评论,来说两句吧...