如何将前端字段名称映射到数据库列名称进行排序

how to map front-end field names to db column names for sorting

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

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

@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);
}

这是我最终在相应的 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>