Java持久层之Hibernate:05_Hibernate查询方式

本文详细介绍了Java中Hibernate的多种查询方式,包括对象导航查询、OID查询、HQL查询(如查询所有、条件、排序、分页、投影和聚合函数)和QBC查询。此外,还探讨了HQL的多表查询(内连接、左外连接、右外连接)以及Hibernate的检索策略(立即查询和延迟查询)。最后,提出了批量抓取的解决方案以减少数据库查询次数。
摘要由CSDN通过智能技术生成


对象导航查询:	根据id查询某个客户,再查询这个客户里面所有的联系人
OID查询:		根据id查询某一条记录,返回对象
HQL查询:		Query对象,写HQL语句实现查询
QBC查询:		Criteria对象
本地SQL查询:	SQLQuery对象,使用普通SQL实现查询

实体类的实现

  • 客户实体类
package com.ycom1024.hernate.po;

import java.util.HashSet;
import java.util.Set;

public class Customer {
   
	private Integer id;
	private String name;
	private String level;
	private String source;
	private String phone;
	private String mobile;
	
	private Set<LinkMan> linkMans = new HashSet<>();

	public Integer getId() {
   
		return id;
	}

	public void setId(Integer id) {
   
		this.id = id;
	}

	public String getName() {
   
		return name;
	}

	public void setName(String name) {
   
		this.name = name;
	}

	public String getLevel() {
   
		return level;
	}

	public void setLevel(String level) {
   
		this.level = level;
	}

	public String getSource() {
   
		return source;
	}

	public void setSource(String source) {
   
		this.source = source;
	}

	public String getPhone() {
   
		return phone;
	}

	public void setPhone(String phone) {
   
		this.phone = phone;
	}

	public String getMobile() {
   
		return mobile;
	}

	public void setMobile(String mobile) {
   
		this.mobile = mobile;
	}

	public Set<LinkMan> getLinkMans() {
   
		return linkMans;
	}

	public void setLinkMans(Set<LinkMan> linkMans) {
   
		this.linkMans = linkMans;
	}

	/**
	 * 注意: 没有打印linkMans的信息
	 */
	@Override
	public String toString() {
   
		return "Customer [id=" + id + ", name=" + name + ", level=" + level + ", source=" + source + ", phone=" + phone
				+ ", mobile=" + mobile + "]";
	}
}
  • 联系人实体类
package com.ycom1024.hernate.po;

public class LinkMan {
   
	private Integer id;
	private String name;
	private String gender;
	private String phone;
	
	private Customer customer;

	public Integer getId() {
   
		return id;
	}

	public void setId(Integer id) {
   
		this.id = id;
	}

	public String getName() {
   
		return name;
	}

	public void setName(String name) {
   
		this.name = name;
	}

	public String getGender() {
   
		return gender;
	}

	public void setGender(String gender) {
   
		this.gender = gender;
	}

	public String getPhone() {
   
		return phone;
	}

	public void setPhone(String phone) {
   
		this.phone = phone;
	}

	public Customer getCustomer() {
   
		return customer;
	}

	public void setCustomer(Customer customer) {
   
		this.customer = customer;
	}

	/**
	 * 注意: 没有打印customer的信息
	 */
	@Override
	public String toString() {
   
		return "LinkMan [id=" + id + ", name=" + name + ", gender=" + gender + ", phone=" + phone + "]";
	}
}

对象导航查询

在这里插入图片描述

  • 代码实现
@Test
public void testQuery1() {
   
	SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
	Session session = sessionFactory.openSession();
	Transaction tx = session.beginTransaction();
	
	// 对象导航查询
	Customer customer = session.get(Customer.class, 11);
	Set<LinkMan> linkMans = customer.getLinkMans();
	for (LinkMan linkMan : linkMans) {
   
		System.out.println(linkMan);
	}
	
	tx.commit();
	session.close();
	sessionFactory.close();
}
-----------------------------------------------------------------------------
Hibernate: 
    select
        customer0_.id as id1_0_0_,
        customer0_.name as name2_0_0_,
        customer0_.level as level3_0_0_,
        customer0_.source as source4_0_0_,
        customer0_.phone as phone5_0_0_,
        customer0_.mobile as mobile6_0_0_ 
    from
        t_customer customer0_ 
    where
        customer0_.id=?
Hibernate: 
    select
        linkmans0_.fk_limlman_customer as fk_limlm5_1_0_,
        linkmans0_.id as id1_1_0_,
        linkmans0_.id as id1_1_1_,
        linkmans0_.name as name2_1_1_,
        linkmans0_.gender as gender3_1_1_,
        linkmans0_.phone as phone4_1_1_,
        linkmans0_.fk_limlman_customer as fk_limlm5_1_1_ 
    from
        t_linkman linkmans0_ 
    where
        linkmans0_.fk_limlman_customer=?
LinkMan [id=23, name=M3, gender=null, phone=null]
LinkMan [id=22, name=M1, gender=male, phone=123456]

OID查询

  • 根据id查询就是OID查询
  • 代码实现:
@Test
public void testQuery2() {
   
	SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
	Session session = sessionFactory.openSession();
	Transaction tx = session.beginTransaction();
	
	// OD查询
	Customer customer = session.get(Customer.class, 11);
	System.out.println(customer);
	
	tx.commit();
	session.close();
	sessionFactory.close();
}
-----------------------------------------------------------------------------
Hibernate: 
    select
        customer0_.id as id1_0_0_,
        customer0_.name as name2_0_0_,
        customer0_.level as level3_0_0_,
        customer0_.source as source4_0_0_,
        customer0_.phone as phone5_0_0_,
        customer0_.mobile as mobile6_0_0_ 
    from
        t_customer customer0_ 
    where
        customer0_.id=?
Customer [id=11, name=AAAAA, level=Vip, source=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值