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

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

  1. Hibernate5.2之HQL查询

    Hibernate5.2之HQL查询                                                                  一. 介绍 Hibernate的 ...

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

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

  3. Hibernate之QBC查询与本地SQL查询

    1. QBC查询:     QBC 查询就是通过使用Hibernate提供的QueryByCriteria API 来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口 ...

  4. Hibernate5笔记4--单表查询

    单表查询:   Hibernate是DAO层技术,对数据的使用,查询是最为重要的.Hibernate的查询技术非常强大,支持原始SQL语句查询,支持QBC查询及Hibernate特有的HQL查询. H ...

  5. hibernate_05_hibernateHQL查询QBC查询和SQL查询

    1.HQL简介:HQL是Hibernate Query Language(Hibernate 查询语言)的缩写,提供更加丰富灵活.更为强大的查询能力:HQL更接近SQL语句查询语法.Hibernate ...

  6. Hibernate4.3 QBC查询

    一.基本查询 1 Session session = HibernateUtils.getSession(); 2 //创建QBC查询接口的实现类 3 Criteria criteria = sess ...

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

    现在假设有一个Student类,内有id,name,age属性String hql = "from Student s";按照以前的做法,我们通常是Query query = se ...

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

    一.QBC检索步骤 QBC检索步骤: 1.调用Session的createCriteria()方法创建一个Criteria对象. 2.设定查询条件.Expression类提供了一系列用于设定查询条件的 ...

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

    现在假设有一个Student类,内有id,name,age属性String hql = "from Student s";按照以前的做法,我们通常是Query query = se ...

随机推荐

  1. linux命令:chgrp

    1.命令介绍: chgrp用来改变文件或目录所属组的权限,要改变成的组必须在/etc/group文件存在才可以. 2.命令格式: chgrp [选项] 组 文件 3.命令参数: 必要参数: -c 当发 ...

  2. Android Studio项目目录结构介绍——android菜鸟成长之路

    在Android Studio中,提供了以下几种项目结构类型 我们一般常用的有以下两种结构: Project 结构类型 app/build/ app模块build编译输出的目录 app/build.g ...

  3. fork函数创建新进程过程分析

    gdb调试执行流程,首先设置断点b sys_clone,当在shell下输入fork命令后,系统执行至断点,接下来按步执行: 判断是否被跟踪 判断是否被创建为轻量级进程(vfork) 判断父进程是否被 ...

  4. JavaScript构造函数学习笔记

    1 理解Javascript constructor实现原理 在 JavaScript 中,每个函数都有名为“prototype”的属性,用于引用原型对象.此原型对象又有名为“constructor” ...

  5. EasyUI 开发笔记(二)

    接上篇 :EasyUI 开发笔记(一)  (http://www.cnblogs.com/yiayi/p/3485258.html) 这期就简单介绍下, easyui 的 list 展示, 在easy ...

  6. Python 基礎 - 字典的操作使用

    接下來介紹字典,這在未來工作上,會是很常使用的,就來好好了解一下唄- 字典是一個 key(鍵)-value(值) 的數據類型,可以儲存很多訊息 #!/usr/bin/env python3 # -*- ...

  7. Lua Coroutine详解

    协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈,局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西.线程与协同程序的主要区别在于,一个具有多线程的程序可以同时运行几个线程 ...

  8. theano中的scan用法

    scan函数是theano中的循环函数,相当于for loop.在读别人的代码时第一次看到,有点迷糊,不知道输入.输出怎么定义,网上也很少有example,大多数都是相互转载同一篇.所以,还是要看官方 ...

  9. 【转】以 java 为例,总结下 appium 里的一方法的使用心得

    转自:http://testerhome.com/topics/1043 1.关于没有name,没有ID的元素的定位---通用篇解题思路:因为没有name,id:其实剩下的选择已不多,要么xpath, ...

  10. 2015.10.15night

    #include<stdio.h> main() { int x,y; scanf("%d",&x); if(x>0)y=1; else {if(x< ...