您的位置:首页 > 其它

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

2010-03-01 15:17 726 查看
声明:编程新手,如有错漏,敬请指出。谢谢。

POJO:Student

package com.test;

import java.util.HashSet;

import java.util.Set;

public class Student

{

private int sid;

private String sname;

private String sage;

private Set<Course> course=new HashSet<Course>();

public Student()

{

}

// getter/setter...

}

POJO:Course

package com.test;

import java.util.HashSet;

import java.util.Set;

public class Course

{

private int cid;

private String cname;

private Set<Student> student=new HashSet<Student>();

public Course() {}

//getter/setter...

}

Student.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.Student" table="student" >

<id name="sid" >

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

<generator class="native"/>

</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 class="com.test.Course" 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 class="native"/>

</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 class="com.test.Student" column="sid"/>

</set>

</class>

</hibernate-mapping>

数据库三个表,student,course,student_course_link(中间表):

DROP TABLE IF EXISTS `java2`.`student`;

CREATE TABLE `java2`.`student` (

`sid` int(10) unsigned NOT NULL auto_increment,

`sname` varchar(16) default NULL,

`sage` varchar(16) default NULL,

PRIMARY KEY (`sid`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `java2`.`course`;

CREATE TABLE `java2`.`course` (

`cid` int(10) unsigned NOT NULL auto_increment,

`cname` varchar(16) default NULL,

PRIMARY KEY (`cid`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `java2`.`student_course_link`;

CREATE TABLE `java2`.`student_course_link` (

`sid` int(10) NOT NULL,

`cid` int(10) NOT NULL,

PRIMARY KEY (`sid`,`cid`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

我们需要一个自定义Comparator:

package com.test;

import java.util.Comparator;

public final class HotCourseComparator implements Comparator {

public int compare(Object arg0, Object arg1) {

Course c1=(Course)arg0;

Course c2=(Course)arg1;

return c2.getStudent().size()-c1.getStudent().size(); // 按照选这门课的人数排序。

}

}

测试类:

public class TestManyToMany

{

public void rankCourse() {

Session
session=HibernateUtil.getSessionFactory().getCurrentSession();

session.beginTransaction();

Query query=session.createQuery("from Course");

List l=query.list();

Collections.sort(l,new HotCourseComparator()); //这里声明使用我们自定义的Comparator

for(int j=0;j<l.size();j++) {

Course c=(Course)l.get(j);

int snum=c.getStudent().size();

System.out.println(c.getCname()+" has "+snum+" students");

}

}

public static void
main(String[] args)

{

TestManyToMany t = new TestManyToMany();

t.rankCourse();

}

}

运行结果:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: