Hibernate之QBC检索和本地SQL检索

时间:2021-06-27 13:47:55

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

本地SQL查询来完善HQL不能涵盖所有的查询特性。

====================代码区======================

测试类

 package com.yl.hibernate.test;

 import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set; import oracle.net.aso.e; import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Conjunction;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import com.yl.hibernate.entities.Department;
import com.yl.hibernate.entities.Employee; public class HibernateTest { private SessionFactory sessionFactory;
private Session session;
private Transaction transaction; @Before
public void init() {
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry =
new ServiceRegistryBuilder().applySettings(configuration.getProperties())
.buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); session = sessionFactory.openSession(); transaction = session.beginTransaction();
}
@After
public void destory() {
transaction.commit(); session.close(); sessionFactory.close();
} @Test
public void testQBC() {
//1.创建一个Ctiteria对象
Criteria criteria = session.createCriteria(Employee.class);
//2.添加查询条件:在QBC中查询条件使用Criterion来表示
//Criterion可以通过Restrictions 的静态方法得到
criteria.add(Restrictions.eq("email", "PRESIDENT"));
criteria.add(Restrictions.gt("salary", 500f));
//3.执行查询
Employee employee = (Employee) criteria.uniqueResult();
System.out.println(employee);
} @Test
public void testQBC2() { Criteria criteria = session.createCriteria(Employee.class);
//1.AND: 使用Conjunction表示
//Conjunction 本身就是一个Criterion对象
//且其中还可以添加Criterion对象
Conjunction conjunction = Restrictions.conjunction();
conjunction.add(Restrictions.like("name", "A", MatchMode.ANYWHERE));
Department dept = new Department();
dept.setId(20);
conjunction.add(Restrictions.eq("dept", dept));
System.out.println(conjunction); //2. OR
Disjunction disjunction = Restrictions.disjunction();
disjunction.add(Restrictions.ge("salary", 1000F));
disjunction.add(Restrictions.isNotNull("email")); criteria.add(disjunction);
criteria.add(conjunction); criteria.list();
/**
* where
(
this_.SALARY>=?
or this_.EMAIL is not null
)
and (
this_.NAME like ?
and this_.DEPT_ID=?
)
*/
} @Test
public void testQBC3() {
Criteria criteria = session.createCriteria(Employee.class); //统计查询: 使用Projection表示: 可以由Projections的静态方法得到
criteria.setProjection(Projections.max("salary")); System.out.println(criteria.uniqueResult());
} @Test
public void testQBC4() {
Criteria criteria = session.createCriteria(Employee.class); //1.添加排序
criteria.addOrder(Order.asc("salary"));
criteria.addOrder(Order.desc("email")); //2.添加分页
int pageSize = 3;
int pageNo = 2;
criteria.setFirstResult((pageNo - 1) * pageSize)
.setMaxResults(pageSize)
.list(); } @Test
public void testNative() {
String sql = "INSERT INTO YL_department VALUES(?, ?)";
Query query = session.createSQLQuery(sql); query.setInteger(0, 50)
.setString(1, "DEV")
.executeUpdate();
} @Test
public void testHQLUpdate() {
String hql = "DELETE FROM Department d WHERE d.id = :id"; session.createQuery(hql).setInteger("id", 50)
.executeUpdate(); }
}