如题,比如一个老师带一个班,一共n个班,现在要查询每个班姓“张”的同学,按老师名显示,老师名下面显示张姓学生。就是(List)Teacher类里的(List)Students里只要需要的数据,不是全部对应,该怎么解决呀?呵呵,我刚开始学Hibernate,各位大侠别见笑,请不吝赐教!
[b]问题补充:[/b]
那我说详细一点,Teacher类有(tid,name),Student类有(id,tid,name),一对多对应之后显示teacher时会自动关联所有的student,但是我希望只显示姓张的student。目标就是要用个循环显示所有的teacher,每个teacher下面显示他带的班级里的姓张的同学。拜托回答的详细一些,谢谢了。
[b]问题补充:[/b]
怎么没人回答呀?是不是这个问题太幼稚了,懒得回答我呀?我已经给了最高分了
方案一:
使用业务方法来完成你的功能,我想你可以实现,这里就不再赘述。
方案二:
使用Hibernate提供的one-to-many来实现,参见
[quote]
set节点有以下属性(摘自Hibernate文档):
(1)
name 集合属性的名称
(2)
table (可选——默认为属性的名称)这个集合表的名称(不能在一对多的关联关系中使用)
(3)
schema (可选) 表的schema的名称, 他将覆盖在根元素中定义的schema
(4)
lazy (可选——默认为false) lazy(可选--默认为false) 允许延迟加载(lazy initialization )(不能在数组中使用)
(5)
inverse (可选——默认为false) 标记这个集合作为双向关联关系中的方向一端。
(6)
cascade (可选——默认为none) 让操作级联到子实体
(7)
sort (可选)指定集合的排序顺序, 其可以为自然的(natural)或者给定一个用来比较的类。
(8)
order-by (可选, 仅用于jdk1.4) 指定表的字段(一个或几个)再加上asc或者desc(可选), 定义Map,Set和Bag的迭代顺序
(9)
where (可选) 指定任意的SQL where条件, 该条件将在重新载入或者删除这个集合时使用(当集合中的数据仅仅是所有可用数据的一个子集时这个条件非常有用)
(10)
outer-join (可选)指定这个集合,只要可能,应该通过外连接(outer join)取得。在每一个SQL语句中, 只能有一个集合可以被通过外连接抓取(译者注: 这里提到的SQL语句是取得集合所属类的数据的Select语句)
(11)
batch-size (可选, 默认为1) 指定通过延迟加载取得集合实例的批处理块大小("batch size")。
(12)
access (可选-默认为属性property):Hibernate取得属性值时使用的策略
[/quote]
这里首先假设你的Tercher和Student model已经写好,并且配置文件也已写好,不会可以参见[url="http://download.csdn.net/source/1099005"]这里[/url]的code(当你运行时请导入相应的jar包,基于Mysql,同样你需要运行ExportDB创建你的数据库,以及运行TestCase,具体请根据你的情况进行更改,有不明白的可以mail给我)。
提一下重点
[quote]
[/code]
这里用到了Set的一个标签where ,你可以在这里写上你的对查询老师时对学生查询的限制条件,其中完全是sql语句,不过这里的students1_.stu_name中students1_是Hibernate运行期生成的student表的别名,具体的请参见你的Hibernate运行之后的结果,我的是运行时发出的SQL是这样的
[quote]
Hibernate:
select
teacher0_.teacher_id as teacher1_0_1_,
teacher0_.teacher_name as teacher2_0_1_,
students1_.teacher_id as teacher3_3_,
students1_.stu_id as stu1_3_,
students1_.stu_id as stu1_1_0_,
students1_.stu_name as stu2_1_0_
from
t_teacher teacher0_
left outer join
[color=red]t_stu students1_ [/color]
on teacher0_.teacher_id=students1_.teacher_id
and (
students1_.stu_name like '张%'
)
where
teacher0_.teacher_id=?
[/quote]
当然这样写死好像不太好,你可以参见Hibernate关于这里set的where条件到底有没有更好的写法。
[code="java"]
Teacher t =(Teacher) session.load(Teacher.class, 3);
Set stus = t.getStudents();
[/code]
这样查出来的stus(老师对应的学生)就都是姓张的同学了。
请详细阐述你的问题
一个老师---一个班级----姓‘张’的同学
把此过程放在循环中就得到(List)Teacher(包含老师、班级、(List)Students)
多表查询,一条语句就ok了
请参阅hibernate reference 条件查询(Criteria Queries)或者你直接写你的HQL语句去实现