1,OID查询:Hibernate根据对象的OID(主键)进行检索。
1.1 使用get方法
public void demo1(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
/**
get方法
1.立即加载,执行到这行代码的时候立即发送sql语句。
2.查询返回的是一个真实对象。
3.如果查询的对象不存在返回null
*/
User user = session.get(User.class, 1l);
System.out.println(user);
transaction.commit();
}
1.2 使用load方法
public void demo1(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
/**
1.load()方法采用的是懒加载,当代码执行到这一行的时候不会马上发送SQL语句。
2.查询返回的是一个代理对象。
3.当查询一个不存在的对象会报错bjectNotFoundException。
*/
User user = session.load(User.class, 1l);
System.out.println(user);
transaction.commit();
}
2. Hibernate:对象导航检索,根据一个已经查询到的对象,查询其关联的对象。
public void demo2(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//1.查询OID为3,的联系人对象。
Linkman linkman = session.get(Linkman.class, 3l);
//2.根据联系人对象查询其关联的客户对象
Customer customer = linkman.getCustomer();
System.out.println(customer);
transaction.commit();
}
```java
public void demo3(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//1.查询OID为1,的客户对象。
Customer customer = session.get(Customer.class, 1l);
//2.根据客户对象查询其关联的联系人对象集合
Set<Linkman> linkmens = customer.getLinkmens();
for (Linkman linkman : linkmens){
System.out.println("联系人:"+linkman);
}
System.out.println(customer);
transaction.commit();
}
3.HQL查询
3.1 HQL简单查询
public void demo3(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//HQL查询
List<Customer> list = session.createQuery("from Customer").list();
for (Customer customer : list){
System.out.println(customer);
}
//原生SQL查询
SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer");
sqlQuery.addEntity(Customer.class);
List<Customer> list = sqlQuery.list();
for(Customer customer:list){
System.out.println(customer);
}
transaction.commit();
}
3.2 HQL别名查询
public void demo4(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
List<Customer> list = session.createQuery("from Customer c").list();
for (Customer customer:list){
System.out.println(customer);
}
transaction.commit();
}
3.3 HQL排序查询
public void demo4(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
List<Customer> list = session.createQuery("from Customer c order by c.cust_id desc").list();
for (Customer customer:list){
System.out.println(customer);
}
transaction.commit();
}
3.4 HQL条件查询
public void demo5(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//单条件,按姓名查询
Query query = session.createQuery("from Customer c where c.cust_name=?");
List<Customer> list = query.setParameter(0, "赵六").list();
for (Customer customer : list){
System.out.println(customer);
}
//模糊查询
Query query = session.createQuery("from Customer c where c.cust_name like ?");
List<Customer> list = query.setParameter(0, "李" + "%").list();
for (Customer customer : list) {
System.out.println(customer);
}
//多条件查询,根据来源,和姓名模糊查询
Query query = session.createQuery("from Customer c where c.cust_source=? and c.cust_name like ?");
query.setParameter(0,"电销");
query.setParameter(1,"王"+"%");
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
//按名称绑定查询
Query query = session.createQuery("from Customer c where c.cust_source = :aaa and c.cust_name like :bbb");
query.setParameter("aaa","电销");
query.setParameter("bbb","王"+"%");
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
//分页查询
Query query = session.createQuery("from Customer c where c.cust_source = :aaa and c.cust_name like :bbb");
query.setParameter("aaa","电销");
query.setParameter("bbb","王"+"%");
query.setFirstResult(0);
query.setMaxResults(2);
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
4. HQL投影查询
public void demo6(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//单个属性
List<Object> list = session.createQuery("select c.cust_name from Customer c").list();
for (Object customer:list){
System.out.println(customer);
}
//多个属性查询
List<Object[]> list = session.createQuery("select c.cust_id, c.cust_name, c.cust_source from Customer c").list();
for (Object[] customer:list){
System.out.println(Arrays.toString(customer));
}
//多个属性查询,封装到对象中
List<Customer> list = session.createQuery("select new Customer(cust_name,cust_source) from Customer").list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
5. HQL使用聚合函数
/**
* HQL分组统计查询
* 聚合函数的使用
* count(),max(),min(),avg(),sum()
*
*/
@Test
public void demo7(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//统计总条数
Query query = session.createQuery("select count(cust_id) from Customer");
Object object = query.uniqueResult();
System.out.println(object);
//分组统计,根据来源分组统计
List<Object[]> list = session.createQuery("select cust_source,count(cust_id) from Customer group by cust_source").list();
for (Object[] customer : list) {
System.out.println(Arrays.toString(customer));
}
transaction.commit();
}
6.HQL的多表查询
内连接
迫切内连接
外连接
左外连接
右外连接
迫切左外连接
public void Demo8(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//显示内连接查询
List<Object[]> list1 = session.createQuery("from Customer c inner join c.linkmens").list();
for(Object[] customer : list1){
System.out.println(Arrays.toString(customer));
}
//迫切内连接,在inner join 添加一个fetch
List<Customer> list2 = session.createQuery(" select distinct c from Customer c inner join fetch c.linkmens").list();
for(Customer customer : list2){
System.out.println(customer);
}
//左外连接查询
List<Object[]> list3 = session.createQuery("from Customer c left join c.linkmens").list();
for (Object[] customer : list3) {
System.out.println(Arrays.toString(customer));
}
//迫切左外连接查询
List<Customer> list4 = session.createQuery("select distinct c from Customer c left join fetch c.linkmens").list();
for (Customer customer : list4) {
System.out.println(customer);
}
//右外连接
List<Object[]> list5 = session.createQuery("from Linkman l right join l.customer").list();
for (Object[] customer : list5) {
System.out.println(Arrays.toString(customer));
}
}
7 .QBC查询
7.1简单查询
/**
* 简单QBC查询
*/
@Test
public void demo9(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.list();
for (Customer customer:list){
System.out.println(customer);
}
transaction.commit();
}
7.2排序查询
/**
* QBC排序
*/
@Test
public void demo10(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(Customer.class);
//正序
// criteria.addOrder(Order.asc("cust_id"));
//倒叙
criteria.addOrder(Order.desc("cust_id"));
List<Customer> list = criteria.list();
for (Customer customer:list){
System.out.println(customer);
}
transaction.commit();
}
7.3条件查询
/**
* QBC多条件查询
* = eq
* > gt
* >= ge
* < lt
* <= le
* <> ne
* like 模糊查询
* in 在什么里
* and 与
* or 或
*/
@Test
public void demo12(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(Customer.class);
criteria.add(Restrictions.eq("cust_source","电销"));
criteria.add(Restrictions.like("cust_name","王"+"%"));
List<Customer> list = criteria.list();
for (Customer customer:list){
System.out.println(customer);
}
transaction.commit();
}
7.4统计查询
/**
* QBC统计查询
* add 普通的条件 where后的条件
* addOrder 排序
* setProjection 聚合函数 和 group by having
*/
@Test
public void demo13(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(Customer.class);
long count = (long)criteria.setProjection(Projections.rowCount()).uniqueResult();
System.out.println(count);
transaction.commit();
}
8.离线条件查询(SSH)—DetachedCriteria
(先简单介绍一下,后边跟Spring整合之后在详解离线查询)
/**
* 离线查询detachedCriteria
*/
@Test
public void demo14(){
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
detachedCriteria.add(Restrictions.like("cust_name","王"+"%"));
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
List<Customer> list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}