SSH 实现论坛模块的上下移动

一、如图:
这里写图片描述

二、实体类:
主要是根据类里的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()方法。
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lovoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值