主要内容:
- 分页查询【重点】
- 对象导航查询【重点】
- 连接查询【重点】
- 统计查询【重点】
- DML风格的操作
一、分页查询
PageQueryTest.java
package cn.itcast.hibernate;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* 分页查询
*/
public class PageQueryTest extends TestCase {
public void testQuery1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
List students = session.createQuery("from Student")
.setFirstResult(1)
.setMaxResults(2)
.list();
for (Iterator iter=students.iterator(); iter.hasNext();) {
Student student = (Student)iter.next();
System.out.println(student.getName());
}
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
}
说明:方法setFirstResult用来设置查询从哪里开始,这里的记录是从0开始,而不是从1开始。方法setMaxResults用来设置查询出多少条记录。
二、对象导航查询
ObjectNavQueryTest.java
package cn.itcast.hibernate;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* 对象导航查询
*/
public class ObjectNavQueryTest extends TestCase {
public void testQuery1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
List students = session.createQuery("select s.name from Student s where s.classes.name like '%1%'").list();
for (Iterator iter=students.iterator(); iter.hasNext();) {
String name = (String)iter.next();
System.out.println(name);
}
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
}
说明:可以看到我们找到班级名称是使用s.classes.name
这样的方式,即使用点号进行导航。
三、连接查询
JoinQueryTest.java
package cn.itcast.hibernate;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* 连接查询
*/
public class JoinQueryTest extends TestCase {
public void testQuery1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
//List students = session.createQuery("select c.name, s.name from Student s join s.classes c").list();
List students = session.createQuery("select c.name, s.name from Student s inner join s.classes c").list();
for (Iterator iter=students.iterator(); iter.hasNext();) {
Object[] obj = (Object[])iter.next();
System.out.println(obj[0] + "," + obj[1]);
}
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
public void testQuery2() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
List students = session.createQuery("select c.name, s.name from Classes c left join c.students s").list();
for (Iterator iter=students.iterator(); iter.hasNext();) {
Object[] obj = (Object[])iter.next();
System.out.println(obj[0] + "," + obj[1]);
}
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
public void testQuery3() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
List students = session.createQuery("select c.name, s.name from Classes c right join c.students s").list();
for (Iterator iter=students.iterator(); iter.hasNext();) {
Object[] obj = (Object[])iter.next();
System.out.println(obj[0] + "," + obj[1]);
}
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
}
说明:
- 1.方法一是使用内连接,其中hql语句就是表示查询出学生的名字,同时还是查询出对应的班级名字。注意其语法。同时只会将同时具备学生和班级的数据查询出来,对于有些没有学生的班级或者有些没有班级的学生是不会查询出来的。
- 2.方法二是使用的外连接中的左连接。这里表示的意思就是将所有班级都查询出来,对于有学生的班级还会将其中的学生查询出来。
- 3.方法三使用的外连接中的右连接。这里表示将所有学生都查询出来,对于有班级的学生还是将其班级查询出来,当然没有班级的学生的班级就是为null。注意区分左和右。
四、统计查询
StatQueryTest.java
package cn.itcast.hibernate;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* 统计查询
*/
public class StatQueryTest extends TestCase {
public void testQuery1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
/*List students =session.createQuery("select count(*) from Student").list();
Long count = (Long)students.get(0);
System.out.println(count);*/
Long count = (Long)session.createQuery("select count(*) from Student").uniqueResult();
System.out.println(count);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
public void testQuery2() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
List students =session.createQuery("select c.name, count(s) from Student s join s.classes c " +
"group by c.name order by c.name").list();
for (Iterator iter=students.iterator(); iter.hasNext();) {
Object[] obj = (Object[])iter.next();
System.out.println(obj[0] + ", " + obj[1]);
}
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
}
说明:
- 1.对于方法一,我们注意不要再使用以前那种方式了,直接使用方法uniqueResult即可。
- 2.对于方法二是结合了内连接查询。会将所有有班级的学生数量都查询出来,同时使用班级名字分组和排序。
五、DML风格的操作
DMLQueryTest.java
package cn.itcast.hibernate;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* DML风格的操作
*/
public class DMLQueryTest extends TestCase {
public void testQuery1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
session.createQuery("update Student s set s.name=? where s.id < ?")
.setParameter(0, "李四")
.setParameter(1, 5)
.executeUpdate();
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
}
说明:就是批量操作,尽量少用,因为其和缓存不同步,也就是说当我们使用此种操作时,数据库中的数据会全部变化,但是缓存中的数据却不会变,这对于经常操作的数据来说就会变成脏数据,所以一般对于相对于比较静态的数据使用。