Hibernate学生选课,实现课程按照学生人数进行排序的方法

分类:好好学习 | 标签: 发表于2010/03/01,15:18 | 没有评论

声明:编程新手,如有错漏,敬请指出。谢谢。

研究了一个星期hibernate,写了一些方法,一个学生可以选多门课,一门课有多个学生,我想把课程按照学生人数进行排序。

在Course类里,有一个attribute是student,是一个collection,通过查询Course,可以得到student这个 collection的size,也就是这个Course的人数。问题来了,hibernate里,可以在mapping文件里设置排序原则,即,在 hbm.xml文件里设置ordery by,但是无法order by一个collection。更不要说order by 一个collection的size了。

所以,我想了一个办法——自定义Comparator。

好了,开始吧。

POJO:Student

package com.test;
  1. import .util.HashSet;
  2. import java.util.Set;
  3. public class Student
  4. {
  5. private int sid;
  6. private String sname;
  7. private String sage;
  8.  
  9. private Set<Course> course=new HashSet<Course>();
  10.  
  11. public Student()
  12. {
  13. }
  14. // getter/setter…
  15. }

POJO:Course

package com.test;
  1.  
  2. import java.util.HashSet;
  3. import java.util.Set;
  4.  
  5. public class Course
  6. {
  7. private int cid;
  8. private String cname;
  9. private Set<Student> student=new HashSet<Student>();
  10.  
  11. public Course() {}
  12. //getter/setter…
  13.  
  14. }

Student.hbm.xml
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE -mapping
PUBLIC “-//Hibernate/Hibernate Mapping DTD 3.0//EN”
“http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>

<hibernate-mapping>

<class name=”com.test.Student” table=”student” >

<id name=”sid” >
<column name=”sid” sql-type=”int(10)” not-null=”true”/>
<generator/>
</id>

<property name=”sname”>
<column name=”sname”/>
</property>

<property name=”sage”>
<column name=”sage”/>
</property>

<set access=”property” name=”course”
table=”student_course_link” batch-size=”10″ fetch=”select”
lazy=”true” cascade=”save-update” inverse=”true”
>
<key column=”sid”/>
<many-to-many column=”cid”/>
</set>
</class>

</hibernate-mapping>
Course.hbm.xml
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE hibernate-mapping
PUBLIC “-//Hibernate/Hibernate Mapping DTD 3.0//EN”
“http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>

<hibernate-mapping>

<class name=”com.test.Course” table=”course” >

<id name=”cid” >
<column name=”cid” sql-type=”int(10)” not-null=”true” />
<generator/>
</id>

<property name=”cname”>
<column name=”cname”/>
</property>

<set access=”property” name=”student” batch-size=”10″ fetch=”select”
table=”student_course_link” lazy=”true” cascade=”save-update”
inverse=”false”>
<key column=”cid”/>
<many-to-many column=”sid”/>
</set>

</class>

</hibernate-mapping>
数据库三个表,student,course,student_course_link(中间表):

DROP TABLE IF EXISTS `java2`.`student`;
  1. CREATE TABLE `java2`.`student` (
  2. `sid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `sname` varchar(16) DEFAULT NULL,
  4. `sage` varchar(16) DEFAULT NULL,
  5. PRIMARY KEY (`sid`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  7.  
  8. DROP TABLE IF EXISTS `java2`.`course`;
  9. CREATE TABLE `java2`.`course` (
  10. `cid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  11. `cname` varchar(16) DEFAULT NULL,
  12. PRIMARY KEY (`cid`)
  13. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  14.  
  15. DROP TABLE IF EXISTS `java2`.`student_course_link`;
  16. CREATE TABLE `java2`.`student_course_link` (
  17. `sid` int(10) NOT NULL,
  18. `cid` int(10) NOT NULL,
  19. PRIMARY KEY (`sid`,`cid`)
  20. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

我们需要一个自定义Comparator:

package com.test;
  1.  
  2. import java.util.Comparator;
  3.  
  4. public final class HotCourseComparator implements Comparator {
  5.  
  6. public int compare(Object arg0, Object arg1) {
  7. Course c1=(Course)arg0;
  8. Course c2=(Course)arg1;
  9.  
  10. return c2.getStudent().size()-c1.getStudent().size(); // 按照选这门课的人数排序。
  11. }
  12.  
  13. }

测试类:

public class TestManyToMany
  1. {
  2. public void rankCourse() {
  3. Session session=HibernateUtil.getSessionFactory().getCurrentSession();
  4. session.beginTransaction();
  5. Query query=session.createQuery("from Course");
  6. List l=query.list();
  7. Collections.sort(l,new HotCourseComparator()); //这里声明使用我们自定义的Comparator
  8. for(int j=0;j&lt;l.size();j++) {
  9. Course c=(Course)l.get(j);
  10. int snum=c.getStudent().size();
  11. System.out.println(c.getCname()+" has "+snum+" students");
  12. }
  13.  
  14. }
  15.  
  16. public static void main(String[] args)
  17. {
  18. TestManyToMany t = new TestManyToMany();
  19. t.rankCourse();
  20.  
  21. }
  22. }

运行结果:

C# has 4 students
Ruby on Rails has 4 students
PHP has 3 students
JAVA has 2 students
C has 2 students
PL/SQL has 2 students
MATLAB has 2 students
C++ has 1 students
Heskell has 1 students
Python has 1 students

相关日志

日志信息 »

该日志于2010-03-01 15:18由 Joy 发表在好好学习分类下, 你可以发表评论。除了可以将这个日志以保留源地址及作者的情况下引用到你的网站或博客,还可以通过RSS 2.0订阅这个日志的所有评论。
没有评论:

发表评论 »

emoticons

« »