首先是一些基础模型类的建立:
- import java.io.Serializable;
- public abstract class BaseObject implements Serializable {
- /** */
- private static final long serialVersionUID = -7443978018690354629L;
- @Override
- public abstract String toString();
- @Override
- public abstract boolean equals(Object o);
- @Override
- public abstract int hashCode();
- }
- public abstract class DefaultIdGeneral extends BaseObject {
- /** */
- private static final long serialVersionUID = -7483768110342207606L;
- // ID
- protected Long id;
- // 版本号,用于Hibernate乐观锁
- protected Integer version;
- /**
- *
- * hibernate.id column="id" generator-class="native"
- *
- * @return Returns the id.
- */
- public abstract Long getId();
- /**
- * @param id
- * The id to set.
- */
- public abstract void setId(Long id);
- /**
- *
- * @hibernate.version
- *
- * @return Returns the version.
- */
- public Integer getVersion() {
- return version;
- }
- /**
- * @param version
- * The version to set.
- */
- public void setVersion(Integer version) {
- this.version = version;
- }
- }
1、多对多关系映射(房间表与设备进行多对多关系映射),两者之间的关系映射时必需有一端的inverse=true,另一端为false,不能两端的inverse都为true。不然在保存或删除两者间的关系时不会对中间表进行操作。
1)房间表
- import java.util.Set;
- import org.apache.commons.lang.builder.EqualsBuilder;
- import org.apache.commons.lang.builder.HashCodeBuilder;
- import org.apache.commons.lang.builder.ToStringBuilder;
- /**
- * title: 建筑中的房间
- *
- * @author Administrator
- * @时间 2009-9-22:下午03:41:43
- * @hibernate.class table="fc_roombasic" dynamic-update="true"
- * dynamic-insert="true"
- */
- public class MapRoom extends DefaultIdGeneral {
- /** */
- private static final long serialVersionUID = -3216302518592517083L;
- /** 房间名称 room_name */
- private String name;
- /** 房间内设备 */
- private Set<Equipment> equipments;
- /**
- * @hibernate.id column="room_id" generator-class="native"
- *
- */
- @Override
- public Long getId() {
- return id;
- }
- @Override
- public void setId(Long id) {
- this.id = id;
- }
- /**
- * @hibernate.property column="room_name"
- *
- */
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- /**
- * @hibernate.set table="fc_room_equipment" lazy="true" cascade="all"
- * inverse="true"
- * @hibernate.collection-many-to-many column="equipment_id"
- * class="com.yinhoo.map.model.Equipment"
- * @hibernate.collection-key column="room_id"
- * @return
- */
- public Set<Equipment> getEquipments() {
- return equipments;
- }
- public void setEquipments(Set<Equipment> equipments) {
- this.equipments = equipments;
- }
- @Override
- public boolean equals(final Object other) {
- ...
- }
- @Override
- public int hashCode() {
- ....
- }
- @Override
- public String toString() {
- .........
- }
- }
2)设备
- import java.util.Set;
- /**
- * title: 设备信息
- *
- * @author Administrator
- * @时间 2009-9-22:下午09:49:32
- * @hibernate.class table="fc_equip" dynamic-update="true" dynamic-insert="true"
- */
- public class Equipment extends DefaultIdGeneral {
- /** 设备名称 */
- private String name;
- /** 使用房间(对应roombasic表room_id) */
- private Set<MapRoom> rooms;
- /**
- * @hibernate.id column="equip_id" generator-class="native"
- *
- */
- @Override
- public Long getId() {
- return id;
- }
- @Override
- public void setId(Long id) {
- this.id = id;
- }
- /**
- * @hibernate.property column="equip_name"
- *
- */
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- /**
- * @hibernate.set table="fc_room_equipment" lazy="true" cascade="all"
- * inverse="false"
- * @hibernate.collection-many-to-many column="room_id"
- * class="com.yinhoo.map.model.MapRoom"
- * @hibernate.collection-key column="equipment_id"
- * @return
- */
- public Set<MapRoom> getRooms() {
- return rooms;
- }
- public void setRooms(Set<MapRoom> rooms) {
- this.rooms = rooms;
- }
- }
2、多对多之间的查询。
- public int getMapRoomTotalRecord(Equipment equipment) {
- String sql = "select count(room.id) from MapRoom as room where room.equipments.id="
- + equipment.getId() + " ";
- // System.out.println(sql);
- return ((Long) getSession().createQuery(sql).uniqueResult())
- .intValue();
- }
- String sql = "select count(room.id) from MapRoom as room join room.equipments as equip where equip.id="
- + equipment.getId() + " ";
- public int getMapRoomTotalRecord(Equipment equipment) {
- String sql = "select count(room.id) from MapRoom as room join room.equipments as equip where equip= :equipment";
- // System.out.println(sql);
- return ((Long) getSession().createQuery(sql).setParameter("equipment",
- equipment).uniqueResult()).intValue();
- }
查询结果集:
- public List<MapRoom> getMapRooms(Equipment equipment,
- int first, int max) {
- String sql = "select room from MapRoom as room join room.equipments as equip where equip= :equipment ";
- return getSession().createQuery(sql).setParameter("equipment",
- equipment).setFirstResult(first).setMaxResults(max).list();
- }
下面是参照http://www.blogjava.net/fuhoujun/archive/2009/01/06/232230.html。
一个老师教许多学生,一个学生被许多老师教,一个学生有好多书,同一种书被许多同学拥有.
要查询教拥有书"a"的学生的老师!
Hql语句:
- SELECT t FROM Teacher t join t.students s join s.books b where b.name = 'a'
解释:t.students s中s并不是集合的意思,而是t的students对象的表别名,join t.students s这个hql,hibernate会翻译成两个表的内连接关系
错误写法:
- SELECT t FROM teacher t where t.students.books.name = 'a'
其实道理是很显然的,t.students是一个Set,那么这个Set怎么可能有books这样的属性呢?同理books.name也不对,所以使用表间连接并给出别名t.students s,此时的对象s才有books属性,所以可以写s.booksb,最后使用b.name限制查询b.name = 'a'.
另外一种写法:
- SELECT t FROM Teacher t,Student s,Book b where s.id in elements(t.students) and b.id in elements(s.books)
这种方法没有出错!不过这种方式要用子查询!