HQL查询 与 多对应的表关系

HQL查询语句

注意: HQL语句查询 面向对象的查询方式

语句中写的东西 都是表示的实体类 或者实体类的属性

查询所有对象

String hql = "from 映射表的类的类名"

查询方法

Query query = session.creatQuery(hql);

@Test
public void fun1() {
	// 使用HQL查询表的所有记录
	Session session = HibernateUitl.getOpenSession();
	Transaction transaction = session.beginTransaction();
	
	String QHL = "from com.lanou3g.User";
	Query<User> query = session.createQuery(QHL);
	// 预见结果集
	// (多个就用list处理 单个就用 uniqueResult)
	List<User> list = query.list();	
	transaction.commit();
	session.close();
}

按条件查询

String hql = "from User where id = ?";

使用 ?占位符   该占位符从0开始

quer.setParameter(0,2);    参数1代表占位符, 参数2表示对占位符进行赋值


	Session session = HibernateUitl.getOpenSession();
	Transaction transaction = session.beginTransaction();	
	String QHL = "from com.lanou3g.User where user_id = 2";
	Query<User> query = session.createQuery(QHL);
	quer.setParameter(0,3);  
	List<User> list = query.list();
	System.out.println(list);

使用冒号" : "占位符 

:后面相当于占位符的名字

在替换时 直接使用冒号后面的名字即可

注意: 冒号后面不要加空格

@Test
	public void fun4() {
	// 使用HQL查询表的所有记录
	Session session = HibernateUitl.getOpenSession();
	Transaction transaction = session.beginTransaction();
	String QHL = "from com.lanou3g.User where user_name = :xxx1 and password = :xxx2";
	Query<User> query = session.createQuery(QHL);
	query.setParameter("xxx1", "wang");
	query.setParameter("xxx2", "123");
	User user = query.uniqueResult();
	System.out.println(user);
		
	transaction.commit();
	session.close();	
}

预见结果集

注意: 如果返回单个结果 可以使用uniqueResult接收结果

query.uniqueResult();

如果返回的是多个结果 使用list接收结果 若使用uniqueResult会报错

List list = query.list();

HQL分页

添加分页

setFirstResult(从第几条开始 0是第一条), 

setMaxResults(打印几条)

@Test
public void fun5() {
	// 使用HQL查询表的所有记录
	Session session = HibernateUitl.getOpenSession();
	Transaction transaction = session.beginTransaction();
		
	String hql = "from User";
	Query<User> query = session.createQuery(hql, User.class);
	// 添加分页
	// limit first(从第几条开始 0是第一条), max(打印几条)
	query.setFirstResult(2);
	query.setMaxResults(2);
	List<User> list = query.list();
	System.out.println(list);
		
	transaction.commit();
	session.close();	
}
表与表之间的对应关系

表关系的创建步骤:

1.分析表关系

2.分析实体类中的变量

3.配置实体类与表之间的关系(配置映射文件)

一对多关系

创建一对多的表关系:

"一"对应的实体类:

在定义实体类时 创建一个容器

// 表示一对多关系的集合
// 注意: 集合需要进行初始化
private Set<LinkMan> linkMans = new HashSet<>();

配置映射文件

"多"对应的实体类:

在定义实体类时

将"多"对应的实体类定义为自己的成员变量

// 表示一对一关系
// 声明一个customer对象当做成员变量
private Customer customer;

配置映射文件

<!-- 配置一对多关系
	name 表示多对一对象的名
	class 表示的是 多对一对象的类
	column 表示外键
	注意: 上面配置property时 不要重复配置外键(不用配lkm_cust_id)
 -->
<many-to-one name="customer" class="Customer" column="lkm_cust_id"></many-to-one>

注意: 

"多"对应的表 创建表时 需要拥有主键(hibernate方法必须)和外键(配置对应关系)

在配置文件时 注意避免重复配置外键     

<!-- 配置一对多关系
	name 表示 实体类对象中的属性名(定义的容器名字)
	column: 填两张表联系的外键
	注意: 两张表外键的名字必须填一致 否则会多创建一个外键出来
	cascade: 级联操作 常用"save-update" 级联保存和更新
        inverse: 反转 true(放弃维护外键) 默认为false
        放弃维护外键可以提高执行效率 但是在一对多的表关系中 只能代表低关系的一方("一")放弃维护
	class: 与哪个类进行联系(一对多)
-->
<set name="linkMans" cascade="save-update" inverse="true">
	<!-- column="外键名" -->
	<key column="lkm_cust_id"></key>
	<!-- class="一对多关系的类的全限定类名" -->
	<one-to-many class="com.lanou3g.LinkMan"/>
</set>
多对多的关系

创建表对应的实体类时 

双方都需要定义一个容器

// 容器
private Set<LegalAdviser> legs = new HashSet<>();
// 容器 
private Set<Company> coms = new HashSet<>();

配置映射文件

<!-- 配置多对多关系 
	name 容器的名字
	table 中间表的名字
	key column 中间引用本类的id
			
	many-to-many 
	class:  对应的多关系的表的类名
	column: 对应的那个表的外键(引用那个表的键)
-->
<set name="roles" table="sys_user_role" inverse="true">
	<key column="user_id"></key>
	<many-to-many class="Role" column="role_id"></many-to-many>
</set>

注意: 多对多表关系配置映射文件时 必须要有一方放弃对外键的维护

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值