您的位置:首页 > 数据库

Hibernate之QBC检索和本地SQL检索

2014-12-02 22:19 218 查看
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();

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: