浏览 2247 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-01-26
最后修改:2011-01-26
public class Student { private Integer id; private Classroom classroom; private String name; /*省略get set方法*/ } public class Classroom { private Integer id; private String name; private Set<Student> students = new HashSet<Student>(); /*省略get set方法*/ } 下面是用annotation设置其双向关联的代码。 在Classroom中设置 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "classroom_id", nullable = true) public Classroom getClassroom() { return this.classroom; } 在Classroom中设置 注:这里“立即加载”是故意的,因为业务特殊性所以没有考虑用“延迟加载”。 @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "classroom") public Set<Student> getStudents() { return this.students; } 下面是需求: 查询出班级编号最小的班级信息和此班级里所有学生信息 用criteria查询,主体代码是这样写的 Criteria criteria = session.createCriteria(Classroom.class); criteria.addOrder(Order.asc("id")); criteria.setMaxResults(1).uniqueResult(); 此查询生成的sql语句大致如下: select c.*, s.* from classroom c left outer join student s on c.id=s.classroomId order by classroom.id desc limit 1 所以结果是classroom的信息查询出来了,但是些班级中的学生信息只查到一个。如果classroom.getStudents()得到的是1。 看了sql语句后就找到问题原因了,都是因为left outer join连接查询惹的祸。如果能进行2次查询,每一次 select * from classroom order by id limit 1; select * from student where student.class_id = *** 多好呀。 以前用.hbm.xml配置时有选项fetch="join/select"貌似可以实现这个功能,而annotation中却无此选项。不知这是annotation的bug,还是annotation故意不实现这个功能。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-02-12
criteria.setMaxResults(1).uniqueResult();
这是怎么回事? |
|
返回顶楼 | |
发表时间:2011-02-14
如果结果有多条,只返回第一条
|
|
返回顶楼 | |