一、如图:
二、实体类:
主要是根据类里的position来实现,查询时order by position
package cn.oppo.oa.domain;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
/**
* 版块
*
* @author chenlin
*
*/
@Entity
@Table(name = "bbs_forum")
public class Forum {
private Long id;
private String name;
private String description;
private int position; // 排序用的位置号
private int topicCount; // 主题数量
private int articleCount; // 文章数量(主题+回复)
private Topic lastTopic; // 最后发表的主题
private Set<Topic> topics = new HashSet<Topic>();
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
@OneToMany(cascade= {CascadeType.ALL},fetch=FetchType.LAZY ,mappedBy="forum")
public Set<Topic> getTopics() {
return topics;
}
public void setTopics(Set<Topic> topics) {
this.topics = topics;
}
public int getTopicCount() {
return topicCount;
}
public void setTopicCount(int topicCount) {
this.topicCount = topicCount;
}
public int getArticleCount() {
return articleCount;
}
public void setArticleCount(int articleCount) {
this.articleCount = articleCount;
}
@ManyToOne
@JoinColumn(name="lastTopicId")
public Topic getLastTopic() {
return lastTopic;
}
public void setLastTopic(Topic lastTopic) {
this.lastTopic = lastTopic;
}
}
三、实现:
查询position上一个实体类:
1、select * from forum where position = ( select max(position) from forum where position < ? );
2、select * from forum where position < ? order by postion desc limit 0,1;
package cn.oppo.oa.service.impl;
import java.util.List;
import org.springframework.stereotype.Service;
import cn.oppo.oa.base.BaseDaoImpl;
import cn.oppo.oa.domain.Forum;
import cn.oppo.oa.service.ForumService;
@Service
@SuppressWarnings("unchecked")
public class ForumServiceImpl extends BaseDaoImpl<Forum> implements ForumService {
@Override
public List<Forum> findAll() {
return getSession().createQuery(//
"FROM Forum f ORDER BY f.position ASC")//
.list();
}
@Override
public void save(Forum forum) {
// 保存到DB,会生成Id的值
getSession().save(forum);
// 指定position的值为最大 // SELECT MAX(f.position) FROM Forum f
forum.setPosition(forum.getId().intValue());
// 因为是持久化状态,所以不需要调用update()方法。
}
public void moveUp(Long id) {
// 获取要交换的两个Forum
Forum forum = getById(id); // 当前操作的Forum
Forum other = (Forum) getSession().createQuery(// 我上面的那个Forum
"FROM Forum f WHERE f.position<? ORDER BY f.position DESC")//
.setParameter(0, forum.getPosition())//
.setFirstResult(0)//
.setMaxResults(1)//
.uniqueResult();
// 最上面的不能上移
if (other == null) {
return;
}
// 交换position的值
int temp = forum.getPosition();
forum.setPosition(other.getPosition());
other.setPosition(temp);
// 更新到数据库中
// 因为是持久化状态,所以不需要调用update()方法。
}
public void moveDown(Long id) {
// 获取要交换的两个Forum
Forum forum = getById(id); // 当前操作的Forum
Forum other = (Forum) getSession().createQuery(// 我下面的那个Forum
"FROM Forum f WHERE f.position>? ORDER BY f.position ASC")//
.setParameter(0, forum.getPosition())//
.setFirstResult(0)//
.setMaxResults(1)//
.uniqueResult();
// 最下面的不能下移
if (other == null) {
return;
}
// 交换position的值
int temp = forum.getPosition();
forum.setPosition(other.getPosition());
other.setPosition(temp);
// 更新到数据库中
// 因为是持久化状态,所以不需要调用update()方法。
}
}