1.【*:*】 关联关系映射
*搭建关联关系
create table t_student35(
id number(5) primary key,
name varchar2(20),
age number(3)
);
create table t_course35(
id number(5) primary key,
name varchar2(20),
ctime number(1)
);
#关系表:描述t_student35 和 t_course35的关系
create table relation_s_c(
course_id number(5) references t_course35(id),
student_id number(5) references t_student35(id),
primary key(course_id,student_id)
);
*映射关联关系
<!-- Student -->
<class name="Student" table="t_student35">
<id name="id" column="id" type="java.lang.Integer">
<!-- id生成器(生成策略),保证在插入数据时id唯一
increment:递增策略
-->
<generator class="increment"></generator>
</id>
<property name="name" type="java.lang.String"></property>
<property name="age" type="java.lang.Integer"></property>
<!-- 关系属性:courses
1.关系属性名
2.关系对方
3.关系中的外键
4.级联
* table="relation_s_c" 关系表
*column="course_id" 对方的外键
-->
<set name="courses" cascade="save-update" table="relation_s_c">
<!-- 指向自己的外键 -->
<key column="student_id"></key>
<!-- 关系对方及对方的外键 -->
<many-to-many class="Course" column="course_id"></many-to-many>
</set>
</class>
<!-- Course -->
<class name="Course" table="t_course35">
<id name="id" column="id" type="java.lang.Integer">
<!-- id生成器(生成策略),保证在插入数据时id唯一
increment:递增策略
-->
<generator class="increment"></generator>
</id>
<property name="name" type="java.lang.String"></property>
<property name="ctime" type="java.lang.Integer"></property>
<!-- 关系属性:students
1.关系属性名
2.关系对方
3.关系中的外键
4.级联
* table="relation_s_c" 关系表
*column="" 对方的外键
*inverse="true" 设置当前方不参与维护外键
-->
<set name="students" cascade="save-update" table="relation_s_c" inverse="true">
<!-- 指向自己的外键 -->
<key column="course_id"></key>
<!-- 关系对方及对方的外键 -->
<many-to-many class="Student" column="student_id"></many-to-many>
</set>
</class>
*使用
=============================================================================================
2.ID维护策略:
2.1 increment 递增
*仅适用于学习测试阶段
*无法适应并发环境
<id name="id" column="id" type="java.lang.Integer">
<generator class="increment"></generator>
</id>
2.2 sequence 序列 oracle db2
<id name="id" column="id" type="java.lang.Integer">
<generator class="sequence">
<param name="sequence">序列名</param>
</generator>
</id>
2.3 identity mysql sqlsever
<id name="id" column="id" type="java.lang.Integer">
<generator class="identity"></generator>
</id>
2.4 uuid :生成一个32位长度的16进制字符的字符串
:此字符串是全球唯一
:适用于分布式开发环境中
<id name="id" column="id" type="java.lang.Integer">
<generator class="uuid"></generator>
</id>
2.5 assigned :手动指定ID
<id name="id" column="id" type="java.lang.Integer">
<generator class="assigned"></generator>
</id>
2.6 foreign:主键来源是外键
<id name="id" column="id" type="java.lang.Integer">
<generator class="foreign">
<param name="property">xxx</param>
</generator>
</id>
=============================================================================================
3.HQL 映射查询:select u.id,u.name,u.age from User u
*from User; select * from t_user;
:查询所有字段
*select u.id,u.name,u.age from User u; <==> selct id,name,age from t_user;
*映射查询的返回值规格:
*映射查询查询多个字段:
String hql="select c.id,c.brand from Computer c where c.id>0";
t_computer35
id brand price
1 lenovo 20 ---> Object[]{1,"lenovo"}
2 lenovo 20 ---> Object[]{2,"lenovo"}
3 lenovo 20 ---> Object[]{3,"lenovo"}
4 lenovo 20 ---> Object[]{4,"lenovo"}
---> List<Object[]>
*映射查询只查询1个字段:
String hql="select c.id from Computer c where c.id>0";
t_computer35
id brand price
1 lenovo 20 ---> Integer 1
2 lenovo 20 ---> Integer 2
3 lenovo 20 ---> Integer 3
4 lenovo 20 ---> Integer 4
---> List<Integer>
String hql="select c.brand from Computer c where c.id>0";
t_computer35
id brand price
1 lenovo1 20 ---> String lenovo1
2 lenovo2 20 ---> String lenovo2
3 lenovo3 20 ---> String lenovo3
4 lenovo4 20 ---> String lenovo4
---> List<String>
*分组:group by having
select c.brand,max(c.price),min(c.price),avg(c.price) from Computer c group by c.brand;
select c.brand,max(c.price) from Computer c where c.id>? group by c.brand having min(c.price)>34
=============================================================================================
4.子查询:
select * from (select * from t_user);
select * from t_user where id>(select id from t_user2 where name='xx');
在hibernate中子查询仅用在where中:
from Computer c where c.id=(select c.id from Computer where c.name='xx');
=============================================================================================
[Java web]-- hibernate3(4)
最新推荐文章于 2022-01-15 21:31:47 发布