如何将前端字段名称映射到db列名称以进行排序

时间:2015-01-12 02:11:41

标签: sorting spring-mvc mybatis

我正在使用Spring MVC 3,Spring Data Commons 1.4.1和MyBatis 3开发Web应用程序。为了支持排序,我发现自己需要将客户端使用的输入字段名称映射到相应列的名称。数据库。例如,在客户端,输入字段称为shortName,而数据库中相应列的名称为SHORT_NAME。最好的方法是什么? Spring是否为此提供任何支持?感谢。

以下是我在域类中注释字段名称的方法,以便稍后在下面的控制器方法中查找它们。

@Entity
public class Activity extends BaseDomainObject {
    @Column(name="ID")
    private Long id;
    private String name;

    @Column(name="SHORT_NAME")
    private String shortName;

    @Column(name="START_TIME")
    private Date startTime;

    @Column(name="END_TIME")
    private Date endTime;

    @Column(name="LOCATION")
    private String location;

    public Activity()
    {

    }

    // getters and setters go here
}       

这是控制器中的方法

public @ResponseBody Page<Activity> query(ActivityCriteria ac, Pageable p) {

    // translate the fiend name used in the front-end into the one used in the back-end
    List<Order> orders = new ArrayList<Order>();
    java.util.Iterator<Order> iterator = p.getSort().iterator();
    while (iterator.hasNext()) {
        Order order = iterator.next();
        if (!StringUtils.isBlank(order.getProperty()) && order.getDirection() != null) {
            String columnName = mapFieldNameToColumnName(Activity.class, order.getProperty());
            Order newOrder = new Order(order.getDirection(), columnName);
            orders.add(newOrder);
        }
    }

    Pageable copy = new PageRequest(p.getPageNumber(), p.getPageSize(), new Sort(orders));

    return activityService.query(ac, copy);
}

1 个答案:

答案 0 :(得分:0)

这是我最终在相应的MyBatis映射文件中所做的事情。

    <select id="getListOfActivitiesWithConditions" resultMap="activityMap" parameterType="map">
    SELECT a.* FROM activity a 
     <include refid="search-conditions"/> 
     <if test="page.sort != null">
        <foreach item="order" index="index" collection="page.sort" open="order by" separator="," close=" ">
            <if test="order.property != null and order.property == 'shortName'">
                SHORT_NAME ${order.direction}
            </if>
            <if test="order.property != null and order.property == 'startTime'">
                START_TIME ${order.direction}
            </if>
        </foreach>
     </if>
     limit #{page.offset}, #{page.size}
    </select>