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();
}
按条件查询
使用 ?占位符 该占位符从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>
注意: 多对多表关系配置映射文件时 必须要有一方放弃对外键的维护