一、條件查詢簡介
條件查詢是更據面向對象特色的數據查詢方式,主要通過如下3個類完成
1、Criteria:代表一次查詢
2、Criterion:代表一個查詢條件
3、Restrictions:產生查詢條件的工具類
執行條件查詢的步驟
1、獲取Hibernate session對象
2、調用session的createCriteria()方法創建Criteria查詢對象
3、使用Restrictions的靜態方法創建Criterion查詢條件
4、通過Criteria的add()方法添加查詢條件到Criteria查詢中
5、執行Criteria的list()或uniqueResult()方法返回結果集
二、條件查詢
1、整表查詢
Criteria c = session.createCriteria(CriteriaTeacher.class); List<CriteriaTeacher> list = c.list(); for (CriteriaTeacher t : list) System.out.println(t.getName());
2、加入查詢條件(通過Criteria的add()方法和Restrictions的靜態方法添加)
Criteria c = session.createCriteria(CriteriaTeacher.class).add(Restrictions.like("name", "%1%")); List<CriteriaTeacher> list = c.list(); for (CriteriaTeacher t : list) System.out.println(t.getName());
3、關聯查詢(前提持久化類內部有映射關系)
如果需要使用關聯實體的屬性來增加查詢條件,則需再次使用createCriteria()方法
a、默認鏈接方式
Criteria c = session .createCriteria(CriteriaStudent.class) .add(Restrictions.like("name", "%1%")) .createCriteria("criteriaTeacher")
//.createCriteria("criteriaTeacher", "ct")//為關聯實體指定別名 .add(Restrictions.like("name", "%1%")); List<CriteriaStudent> list = c.list(); for (CriteriaStudent s : list) System.out.println("studentName = " + s.getName() + " | teacherName = " + s.getCriteriaTeacher().getName());
b、指定鏈接方式
Criteria c = session .createCriteria(CriteriaStudent.class) .add(Restrictions.like("name", "%1%")) .createCriteria("criteriaTeacher", JoinType.LEFT_OUTER_JOIN);//左連接方式 List<CriteriaStudent> list = c.list(); for (CriteriaStudent s : list) System.out.println("studentName = " + s.getName() + " | teacherName = " + s.getCriteriaTeacher().getName());
c、也可以使用createAlias()方法代替createCriteria()方法
Criteria c = session .createCriteria(CriteriaStudent.class) .add(Restrictions.like("name", "%1%")) .createAlias("criteriaTeacher", "ct") .add(Restrictions.like("ct.name", "%1%")); List<CriteriaStudent> list = c.list(); for (CriteriaStudent s : list) System.out.println("studentName = " + s.getName() + " | teacherName = " + s.getCriteriaTeacher().getName());
4、投影、聚合、分組查詢
hibernate中使用Projection接口代表投影運算,hibernate通過Criteria的setProjection(Projections p)方法進行投影運算,其中Projections作為產生Projection的工廠。
a、投影運算查詢
Criteria c = session .createCriteria(CriteriaStudent.class) .setProjection(Projections.projectionList() .add(Projections.rowCount()));//統計表中記錄條數 System.out.println(c.uniqueResult());
Criteria c = session .createCriteria(CriteriaStudent.class) .setProjection(Projections.projectionList() .add(Projections.count("name")) .add(Projections.groupProperty("name")));//據name值分組統計 List list = c.list(); for(Object ob : list) { Object[] ob1 = (Object[]) ob; System.out.println(ob1[1] + " | " + ob1[0]); }
Criteria c = session .createCriteria(CriteriaStudent.class) .setProjection(Projections.projectionList() .add(Projections.groupProperty("name")));//name去重后列表 List<String> list = c.list(); for(String s : list) { System.out.println(s); }
用alias()方法為指定投影指定別名
Criteria c = session .createCriteria(CriteriaStudent.class) .setProjection(Projections.projectionList() .add(Projections.alias(Projections.count("name"), "count"))//指定別名 .add(Projections.groupProperty("name"))) .addOrder(Order.desc("count"));//用別名排序 List list = c.list(); for(Object ob : list) { Object[] ob1 = (Object[]) ob; System.out.println(ob1[1] + " | " + ob1[0]); }
b、選擇查詢(指定要查找的列)
查詢一列
Criteria c = session .createCriteria(CriteriaStudent.class) .setProjection(Projections.projectionList() .add(Property.forName("name"))); List<String> list = c.list(); for(String s : list) { System.out.println(s); }
查詢多列
Criteria c = session .createCriteria(CriteriaStudent.class) .createAlias("criteriaTeacher", "ct") .setProjection(Projections.projectionList() .add(Property.forName("ct.name")) .add(Property.forName("name"))); List list = c.list(); for(Object ob : list) { Object[] ob1 = (Object[]) ob; System.out.println(ob1[1] + " | " + ob1[0]); }
5、離線查詢和子查詢
DetachedCriteria代表離線查詢(允許再session范圍之外創建一個查詢)和子查詢(把DetachedCriteria的查詢結果傳入Criteria中作為查詢條件時,DetachedCriteria就變成了子查詢)
DetachedCriteria sub = DetachedCriteria .forClass(CriteriaTeacher.class) .setProjection(Projections.projectionList() .add(Property.forName("id"))) .add(Restrictions.like("name", "%1%")); Criteria c = session .createCriteria(CriteriaStudent.class) .add(Subqueries.propertyIn("criteriaTeacher", sub)); List<CriteriaStudent> list = c.list(); for(CriteriaStudent s : list) { System.out.println(s.getName() + " | " + s.getCriteriaTeacher().getName()); }
下面是測試學習時用到的持久化類
@Entity @Table(name = "criteria_teacher") public class CriteriaTeacher { @Id @GeneratedValue private Long id; private String name; @OneToMany(targetEntity = CriteriaStudent.class, mappedBy = "criteriaTeacher") private Set<CriteriaStudent> criteriaStudents = new HashSet<CriteriaStudent>(); public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<CriteriaStudent> getCriteriaStudents() { return criteriaStudents; } public void setCriteriaStudents(Set<CriteriaStudent> criteriaStudents) { this.criteriaStudents = criteriaStudents; } }
@Entity @Table(name = "criteria_student") public class CriteriaStudent { @Id @GeneratedValue private Long id; private String name; @ManyToOne(targetEntity = CriteriaTeacher.class) @JoinColumn(name = "teacher_id", referencedColumnName = "id", nullable = false) private CriteriaTeacher criteriaTeacher; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public CriteriaTeacher getCriteriaTeacher() { return criteriaTeacher; } public void setCriteriaTeacher(CriteriaTeacher criteriaTeacher) { this.criteriaTeacher = criteriaTeacher; } }
測試類
public class CriteriaTestController { public static void main(String[] args) { Configuration cf = new Configuration().configure(); SessionFactory sf = cf.buildSessionFactory(); Session session = sf.openSession(); Transaction ts = session.beginTransaction(); try { Criteria c = session .createCriteria(CriteriaStudent.class) .setProjection(Projections.projectionList() .add(Property.forName("name"))); List<String> list = c.list(); for(String s : list) { System.out.println(s); } ts.commit(); } finally { session.close(); sf.close(); } } }
代碼下載:https://github.com/shaoyesun/hibernate_study.git