我正在使用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);
}
答案 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>