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
@Testpublic 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());
    }
}
时间: 2024-10-20 07:04:29

Hibernate5.2之QBC查询的相关文章

[原创]java WEB学习笔记92:Hibernate学习之路-- -QBC 检索和本地 SQL 检索:基本的QBC 查询,带 AND 和 OR 的QBC,统计查询,排序,分页

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Hibernate中createCriteria即QBC查询的详细用法 .Hibernate中createCriteria即QBC查询的详细用法 .

现在假设有一个Student类,内有id,name,age属性String hql = "from Student s";按照以前的做法,我们通常是Query query = session.createQuery(hql);或者要按照条件检索的话.String hql = "from Student s where s.name like '王%'"Query query = session.createQuery(hql);不用HQL而使用QBC的话,那么代码为

Hibernate中的QBC查询

QBC 查询方式(Query By Criteria) public void testQBCQuery1(){ Criteria criteria=session.createCriteria(Student.class); List<Student> studentList=criteria.list(); Iterator it=studentList.iterator(); while(it.hasNext()){ Student s=(Student)it.next(); Syste

QBC查询、离线条件查询(DetachedCriteric)和分页查询模版

一.QBC检索步骤 QBC检索步骤: 1.调用Session的createCriteria()方法创建一个Criteria对象. 2.设定查询条件.Expression类提供了一系列用于设定查询条件的静态方法, 这些静态方法都返回Criterion实例,每个Criterion实例代表一个查询条件. Criteria的add()方法用于加入查询条件. 3.调用Criteria的list()方法执行查询语句.该方法返回List类型的查询结果,在 List集合中存放了符合查询条件的持久化对象. 比较运

Hibernate中createCriteria即QBC查询的详细用法

现在假设有一个Student类,内有id,name,age属性String hql = "from Student s";按照以前的做法,我们通常是Query query = session.createQuery(hql);或者要按照条件检索的话.String hql = "from Student s where s.name like '王%'"Query query = session.createQuery(hql);不用HQL而使用QBC的话,那么代码为

Hibernate5.1+Sqlserver2000分页查询

前几天改到一个bug:从MS SQLserver上面同步表结构并且采集数据写入其他库.然后用的核心技术是用的Hibernate. 其中bug出在SQLServer2000版本上.排查下来发现2000版本真的是一个让人头疼的数据库. 驱动jar包不兼容:hibernate5.1分页查询也不能用.系统表也与其他版本的天差地别. 一.驱动问题 一开始上网查询,发现大家都推荐用JTDS驱动.但是JTDS貌似不能与官方的Hibernate兼容,需要使用第三方Hibernate. 不然Hibernate在建

QBC查询

1.基本语法 session.beginTransaction(); Criteria criteria = session.createCriteria(Person.class); SimpleExpression gt = Restrictions.eq("name","张三"); criteria.add(gt); List<Person> list = criteria.list(); A.     Criteria setFirstResul

Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询

HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了类或者对象.其它的,包括一些查询函数(count(),sum()等).查询条件的设定等,全都跟SQL语法一样. 示例: Session session = SessionFactory.getCurrentSession(); User user = null; Transaction ts = s

Hibernate5.2之原生SQL查询

Hibernate5.2之原生SQL查询 一. 介绍  在上一篇博客中笔者通过代码的形式给各位读者介绍了Hibernate中最重要的检索方式--HQL查询.在本博文中笔者将向各位读者介绍Hibernate中的原生SQL查询,虽为原生SQL查询,但是笔者认为Hibernate在针对不同的数据库在分页语句的处理上做的很不错,我们不用去关心使用的是何种的数据库.本博文会沿用<Hibernate5.2之HQL查询>中的POJO类和配置文件,请各位看官在阅读本博文之前请先阅读该文章,本篇文章会将HQL中