工作2年多了,Hibernate使用不多,更别说精通了。平时都是习惯写sql,连hql都不太想写,觉得别扭,特别是如果查询比较复杂时,需要根据执行计划确保sql较优,如果是hibernate来自动生成,心里特不踏实。本人对hibernate一直比较抵触。不愿花时间去深入学习hibernate,更别说Criteria了。现在换了新公司,新公司的项目使用hibernate的,并且查询都是用Criteria,这就逼得我不得不学习了。现在慢慢的一步一步的记录下学习过程吧。
Criteria是一种比hql更面向对象的查询方式,使用它,不需要你写sql,hql,一切都自动生成。
废话不多说了,简单搭建了个hibernate环境,动手敲代码,通过小例子来慢慢学习吧。
Student.java
package com.fei.hibernate.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="student")
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
TestModel.java
package com.fei.hibernate.model;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Order;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class TestModel {
public static SessionFactory sf=null;
@BeforeClass
public static void beforeClass(){
sf=new Configuration().configure().buildSessionFactory();
}
@AfterClass
public static void afterClass(){
sf.close();
}
/**
* select * from student order by age asc limit 1,4;
*/
@Test
public void test01(){
Session session = sf.openSession();
Criteria criteria = session.createCriteria(Student.class);
criteria.addOrder(Order.asc("age"));
criteria.setMaxResults(4);
criteria.setFirstResult(1);
List<Student> students = criteria.list();
print(students);
session.close();
}
private void print(List<Student> students){
System.out.println("===================================");
System.out.println("id\t name\t age\t");
for(Student s : students){
System.out.println(s.getId()+"\t"+s.getName()+"\t"+s.getAge()+"\t");
}
}
}
运行结果
Hibernate:
select
this_.id as id0_0_,
this_.age as age0_0_,
this_.name as name0_0_
from
student this_
order by
this_.age asc limit ?,
?
===================================
id name age
5 张蕊 15
4 蔡琰 16
6 西施 16
2 貂蝉 18
代码下载