Hibernate5.2值QBC查詢
一.簡介
Hibenate的QBC查詢個人認為是Hibernate的很大一個亮點,提供個豐富的查詢API,在使用上可能顯得稍稍有些繁瑣。但是QBC據筆者多年的從業經驗上來講,幾乎沒有什么程序員使用,可能是源於其API有些多。那么本篇文章筆者還是按照之前的博文一樣,提供大量的示例,而且筆者承諾這些示例在后期一定會不斷的增加,也希望各位讀者多多提一些寶貴意見,或者碰到什么問題,可以給本人留言,本人會虛心的接收或者給出本人覺得合適的一些解決方法。
本文所采用的數據庫表應該是所有學過Oracle的讀者都會經歷的兩張表(即scott用戶的emp和dept表)。
二.數據庫腳本
create table EMP ( empno NUMBER(4) not null, ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4), hiredate DATE, sal NUMBER(7,2), comm NUMBER(7,2), deptno NUMBER(2), primary key (EMPNO) ); create table DEPT ( deptno NUMBER(2) not null, dname VARCHAR2(14), loc VARCHAR2(13), primary key (DEPTNO) );
數據庫中現有的數據如下:
EMP
DEPT
三.基礎測試類代碼
3.1 獲取Session工具類
public class OracleSessionUtils { //獲取SessionFactory public static SessionFactory getSessionFactory(){ StandardServiceRegistry registry = null; SessionFactory sessionFactory = null; try{ registry = new StandardServiceRegistryBuilder().configure("hibernate-oracle.xml").build(); //不指定文件名默認是找hibernate.cfg.xml文件 //registry = new StandardServiceRegistryBuilder().configure().build(); sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory(); }catch(Exception ex){ ex.printStackTrace(); StandardServiceRegistryBuilder.destroy(registry); } return sessionFactory; } //打開並返回一個Session public static Session openSession(){ return getSessionFactory().openSession(); } //關閉Session public static void closeSession(Session session){ if(null != session){ session.close(); } } }
3.2單元測試基礎代碼
public class HibernateQBCTest { private Session session; @Before public void getSession(){ session = OracleSessionUtils.openSession(); } @After public void closeSession(){ OracleSessionUtils.closeSession(session); } }
四.POJO類的創建
Emplyee.java
@Entity @Table(name="emp") public class Employee { @Id @Column(name="empno") @GenericGenerator(name="assignedGenerator", strategy="assigned") @GeneratedValue(generator="assignedGenerator") private int id; @Column(name="ename") private String ename; @Column(name="job") private String job; @Column(name="hiredate") private Date hiredate; @Column(name="sal") private Double salary; @Column(name="comm") private Double comm; @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="deptno") private Department dept; //getter and setter }
Department.java
@Entity @Table(name="dept") public class Department { @Id @Column(name="deptno") @GenericGenerator(name="assignedGenerator", strategy="assigned") @GeneratedValue(generator="assignedGenerator") private int id; @Column(name="dname") private String departmentName; @Column(name="loc") private String location; @OneToMany(mappedBy="dept", fetch=FetchType.LAZY) private Set<Employee> empSet; //setter and getter }
五.QBC查詢用例
A.查詢所有的員工
//查詢所有 @Test public void list(){ List<Employee> empList = session.createCriteria(Employee.class).list(); for(Employee e : empList){ System.out.println(e.getEname()); } }
B.分頁查詢員工
//分頁查詢 @Test public void pageList(){ List<Employee> empList = session.createCriteria(Employee.class).setFirstResult(0).setMaxResults(4).list(); for(Employee e : empList){ System.out.println(e.getEname()); } }
C.Like查詢,忽略大小寫
//like查詢,忽略大小寫 @Test public void likeQuery(){ /* List<Employee> empList = session.createCriteria(Employee.class).add(Restrictions.like("ename", "%a%").ignoreCase()).list(); */ List<Employee> empList = session.createCriteria(Employee.class).add(Restrictions.like("ename", "a", MatchMode.ANYWHERE).ignoreCase()).list(); for(Employee e : empList){ System.out.println(e.getEname()); } }
D.between查詢
//日期或者Id的between查詢 @Test public void betweenQuery(){ /* List<Employee> empList = session.createCriteria(Employee.class).add(Restrictions.between("id", 7000, 8000)).list(); for(Employee e : empList){ System.out.println(e.getEname()); } */ String beginDateStr = "1980-07-26 00:00:00"; String endDateStr = "2016-07-28 23:59:59"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); Date beginDate = null; Date endDate = null; try { beginDate = sdf.parse(beginDateStr); endDate = sdf.parse(endDateStr); } catch (ParseException e) { e.printStackTrace(); } List<Employee> empList = session.createCriteria(Employee.class).add(Restrictions.between("hiredate", beginDate, endDate)).list(); for(Employee e : empList){ System.out.println(e.getEname()); }
}
E.in查詢
//in查詢 @Test public void inQuery(){ List<Employee> empList = session.createCriteria(Employee.class).add(Restrictions.in("id", new Integer[]{7369, 7499})).list(); for(Employee e : empList){ System.out.println(e.getEname()); } }
F.>或>=
//>= 或者 > @Test public void gtOrGeQuery(){ //List<Employee> empList = session.createCriteria(Employee.class).add(Restrictions.gt("id", 7500)).list(); // 大於(>) List<Employee> empList = session.createCriteria(Employee.class).add(Restrictions.ge("id", 7521)).list(); // 大於等於(>=) for(Employee e : empList){ System.out.println(e.getEname()); }
}
G.<或<=
//<或者<= @Test public void ltOrLeQuery(){ //List<Employee> empList = session.createCriteria(Employee.class).add(Restrictions.lt("id", 7500)).list(); // 小於(<) List<Employee> empList = session.createCriteria(Employee.class).add(Restrictions.le("id", 7521)).list(); // 小於等於(<=) for(Employee e : empList){ System.out.println(e.getEname()); } }
H.=查詢
//= @Test public void eqQuery(){ List<Employee> empList = session.createCriteria(Employee.class).add(Restrictions.eq("id", 7521)).list(); // 等於(=) for(Employee e : empList){ System.out.println(e.getEname()); } }
I.多條件查詢(and)
//多條件查詢and @Test
public void multiAndQuery(){ String beginDateStr = "1980-07-26 00:00:00"; String endDateStr = "2016-07-28 23:59:59"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); Date beginDate = null; Date endDate = null; try { beginDate = sdf.parse(beginDateStr); endDate = sdf.parse(endDateStr); } catch (ParseException e) { e.printStackTrace(); } List<Employee> empList = session.createCriteria(Employee.class) .add(Restrictions.ge("id", 7521)) .add(Restrictions.between("hiredate", beginDate, endDate)) .add(Restrictions.like("ename", "a", MatchMode.ANYWHERE).ignoreCase()) .list(); for(Employee e : empList){ System.out.println(e.getEname()); }
}
G.多條件查詢(or)
//多條件或者查詢 @Test public void multiOrQuery(){ List<Employee> empList = session.createCriteria(Employee.class) .add(Restrictions.or(Restrictions.eq("id", 7521), Restrictions.like("ename", "A%").ignoreCase())) .list(); for(Employee e : empList){ System.out.println(e.getEname()); } }
K.排序
//排序 @Test public void orderQuery(){ List<Employee> empList = session.createCriteria(Employee.class).addOrder(Order.desc("salary")).list(); for(Employee e : empList){ System.out.println(e.getEname()); } }
L.統計
//統計20號部門有多少人 @Test public void countQuery(){ List<Integer> list = session.createCriteria(Employee.class).setProjection(Projections.rowCount()).add(Restrictions.eq("dept.id", 20)).list(); System.out.println(list.get(0)); }
M.統計
//統計各個部門的人數、工資的平均值、工資的最大值、工資的最小值、工資的總和 @Test public void count(){ List<Object[]> list = session.createCriteria(Employee.class) .setProjection(Projections.projectionList() .add(Projections.property("dept.id")) .add(Projections.rowCount()) .add(Projections.avg("salary")) .add(Projections.max("salary")) .add(Projections.min("salary")) .add(Projections.sum("salary")) .add(Projections.groupProperty("dept.id")) ).list(); for(Object[] obj : list){ for(Object o : obj){ System.out.print(o + " "); } System.out.println(); } }
N.投影(單列)
//只查詢單獨的一列 @Test public void singleColumn(){ List<String> list = session.createCriteria(Employee.class) .setProjection(Projections.property("ename")).list(); for(String str : list){ System.out.println(str); } }
O.投影(多列)
//只查詢工號和姓名 @Test public void nameAndNoQuery(){ List<Object[]> list = session.createCriteria(Employee.class) .setProjection( Projections.projectionList() .add(Projections.property("ename")) .add(Projections.property("id")) ).list(); for(Object[] obj : list){ for(Object o : obj){ System.out.print(o + " "); } System.out.println(); } }
P.樣例查詢
//樣例查詢 @Test public void exampleQuery(){ Employee e = new Employee(); e.setJob("CLERK"); Example example = Example.create(e).ignoreCase(); List<Employee> list = session.createCriteria(Employee.class).add(example).list(); for(Employee em : list){ System.out.println(em.getEname()); } }
Q.非空查詢
//非空查詢 @Test public void notNullQuery(){ List<Employee> list = session.createCriteria(Employee.class).add(Restrictions.isNotNull("comm")).list(); for(Employee e : list){ System.out.println(e.getEname()); } }