hibernate检索
检索策略
类级别检索策略: lazy:默认是true,表示懒加载 若为false,则是直接加载 >>若使用get方法:则lazy不起作用,都会直接发送sql语句 >>若使用load方法:则会进行懒加载,直到访问对象的非id属性时才会select语句 set标签中的检索策略: <set name="set" table="ORDERS" inverse="true" lazy="true" batch-size="3" fetch="join"> lazy:默认是true,表示懒加载 >>用set属性时才查询 若为false >>查询Customer时,连发两条select语句,第一句查Customer,第二句查set 若为extra,则表示增强懒加载,尽可能延迟初始化的时机, 比如size()时 select count(ORDER_ID) from ORDERS where CUSTOMER_ID =? batch-size:批量处理用来为延迟检索策略或立即检索策略设定批量检索的数量.(extra增强懒加载不适用) 批量检索能减少 SELECT 语句的数目, 提高延迟检索或立即检索的运行性能. 一次处理两个时 select set0_.CUSTOMER_ID as CUSTOMER3_0_1_, set0_.ORDER_ID as ORDER_ID1_1_1_, set0_.ORDER_ID as ORDER_ID1_1_0_, set0_.ORDER_DESC as ORDER_DE2_1_0_, set0_.CUSTOMER_ID as CUSTOMER3_1_0_ from ORDERS set0_ where set0_.CUSTOMER_ID in ( ?, ? ) 若为增强懒加载,则不起作用 fetch:默认是select:就是正常,简单的select查询 当 fetch 属性为 “subselect” 时 1.假定 Session 缓存中有 n 个 orders 集合代理类实例没有被初始化, Hibernate 能够通过带子查询的 select 语句, 来批量初始化 n 个 orders 集合代理类实例 2.batch-size 属性将被忽略 3.子查询中的 select 语句为查询 CUSTOMERS 表 OID 的 SELECT 语句 当 fetch 属性为 “join” 时: 1.检索 Customer 对象时, 会采用迫切左外连接(通过左外连接加载与检索指定的对象关联的对象) 策略来检索所有关联的 Order 对象 2.lazy 属性将被忽略 3.Query 的list() 方法会忽略映射文件中配置的迫切左外连接检索策略, 而依旧采用延迟加载策略 <many-to-one>和<one-to-one>同上
检索方法
1.HQL
package jiansuo_jiben;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class TestHQL {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void before(){
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 after(){
transaction.commit();
session.close();
sessionFactory.close();
}
@Test
public void test() {
Query query = session.createQuery("FROM Employee where salary >= :sal and"
+ " department = :dep order by salary asc");
Department d = new Department();
d.setId(1);
query.setInteger("sal", 500).setEntity("dep", d);
List<Employee> es = query.list();
System.out.println(es);
Iterator<Employee> it = es.iterator();
while(it.hasNext()){
System.out.println(it.next().getName());
}
}
@Test
public void testPageQuery() {//分页查询
Query q = session.createQuery("FROM Employee ORDER BY salary desc");
int pageNo = 1;//第几页,从1开始
int pageSize = 3;//每页几条记录
q.setFirstResult( (pageNo-1) * pageSize );//设置第一条记录的位置
q.setMaxResults(pageSize);//设置每页的记录条数
List<Employee> es = q.list();
for(Employee e:es){
System.out.println(e);
}
}
@Test
public void testNameQuery() {//命名查询,在hbm.xml文件中写hql
//<query name="minSalaryAsDepartment"><![CDATA[SELECT min(e.salary) FROM Employee e GROUP BY e.department]]></query>
Query q = session.getNamedQuery("minSalaryAsDepartment");//引用
// Department dep = new Department();
// dep.setId(2);
//
// q.setEntity("dep", dep);
List<Integer> mins = q.list();
System.out.println(mins);
}
@Test
public void testFieldQuery() {//字段查询,要用对应的构造方法,也可不封装
String hql = "SELECT new Employee(e.salary,e.name,e.department) FROM Employee e WHERE e.department = :dep";
Department dep = new Department();
dep.setId(1);
Query q = session.createQuery(hql);
q.setEntity("dep", dep);
List<Employee> os = q.list();
for(Employee o:os){
System.out.println(o);
}
}
@Test
public void test_baobiao_Query() {//报表查询,使用对应的方法
String hql = "SELECT min(e.salary),max(e.salary) FROM Employee e WHERE e.salary>100 GROUP BY e.department";
Query q = session.createQuery(hql);
List<Object[]> os = q.list();
for(Object[] o:os){
System.out.println(Arrays.asList(o));
}
}
}
2.QBC
package jiansuo_jiben;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
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.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.jdbc.Work;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class TestQBC_SQL_Cache {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void before(){
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 after(){
transaction.commit();
session.close();
sessionFactory.close();
}
@Test
public void testQBC4(){
Criteria criteria = session.createCriteria(Employee.class);
//1. 添加排序
criteria.addOrder(Order.asc("salary"));
criteria.addOrder(Order.desc("name"));
//2. 添加翻页方法
int pageSize = 5;
int pageNo = 3;
List<Employee> es = criteria.setFirstResult((pageNo - 1) * pageSize)
.setMaxResults(pageSize)
.list();
for(Employee e:es){
System.out.println(e);
}
}
@Test
public void testQBC3(){//跟报表查询差不多
Criteria criteria = session.createCriteria(Employee.class);
//统计查询: 使用 Projection 来表示: 可以由 Projections 的静态方法得到
criteria.setProjection(Projections.max("salary"));
System.out.println(criteria.uniqueResult()); //50000
}
@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(80);
conjunction.add(Restrictions.eq("department", dept));
System.out.println(conjunction);
//2. OR
Disjunction disjunction = Restrictions.disjunction();
disjunction.add(Restrictions.le("salary", 6000));
disjunction.add(Restrictions.isNull("name"));
System.out.println(disjunction);
criteria.add(disjunction);
criteria.add(conjunction);
criteria.list();
}
@Test
public void testQBC(){
//1. 创建一个 Criteria 对象
Criteria criteria = session.createCriteria(Employee.class);
//2. 添加查询条件: 在 QBC 中查询条件使用 Criterion 来表示
//Criterion 可以通过 Restrictions 的静态方法得到
criteria.add(Restrictions.eq("email", "SKUMAR"));
criteria.add(Restrictions.gt("salary", 5000F));
//3. 执行查询
Employee employee = (Employee) criteria.uniqueResult();
System.out.println(employee);
}
}
3.本地SQL
package jiansuo_jiben;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
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.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.jdbc.Work;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class TestQBC_SQL_Cache {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void before(){
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 after(){
transaction.commit();
session.close();
sessionFactory.close();
}
@Test
public void testHQLUpdate(){
String hql = "DELETE FROM Department d WHERE d.id = :id";
session.createQuery(hql).setInteger("id", 280)
.executeUpdate();
}
@Test
public void testNativeSQL(){
String sql = "INSERT INTO gg_department VALUES(?, ?)";
Query query = session.createSQLQuery(sql);
query.setInteger(0, 280)
.setString(1, "ATGUIGU")
.executeUpdate();
}
}
浙公网安备 33010602011771号