Hibernate5.2之QBC查詢


                                                     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());
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM