假设实体为 Coupon,一个字段为public Date CreateTime;这时,如何通过Coupon.find(" CreateTime>? ",param)来进行查询?
有两种方式解决这一问题,
第一个:主要用在get请求时,这种方式使用时有限制,不能通用,特别是前端通过Json串传到后端时
第二个:这种方式用途更广泛,能解决几乎所有这类问题,目前还未发现它有什么局限性。
(1)在Action方法的参数前面添加修饰符
使用@As注解,我们可以指定日期格式。
例如:
archives?from=21/12/1980
public static void articlesSince(@As("dd/MM/yyyy") Date from) {
List<Article> articles = Article.findBy("date >= ?", from);
render(articles);
}
我们可还以对不同的语种定义不同的格式,例如
public static void articlesSince(@As(lang={"fr,de","*"}, value={"dd-MM-yyyy","MM-dd-yyyy"}) Date from) {
List<Article> articles = Article.findBy("date >= ?", from);
render(articles);
}
在这个例子中,我们将法国和德国的日期定义为 dd-MM-yyyy ,其它都为 MM-dd-yyyy. 注意语种可用逗号分隔。注意参数lang的个数必须与value的个数相等。
如果没有使用@As注解,则Play将使用你的区域对应的默认日期格式。我们可在“conf/application.conf”中使用“date.format”为key来配置该格式.
(2)用在有Post请求、JSON传值到后台的情况,将实体字段前面加上注解,更简单一些
@Entity
@Table(name = "mk_coupon")
public class Coupon extends Model{
@Table(name = "mk_coupon")
public class Coupon extends Model{
@Temporal(TemporalType.DATE)
@As(("yyyy-MM-dd"))
public Date expireStartDate;
public Date expireStartDate;
...
}
在post后台方法中,可以这样格式化时间
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date date=new Date();
String now=df.format(date);
List<Object> param = new ArrayList<Object>();
Date date=new Date();
String now=df.format(date);
List<Object> param = new ArrayList<Object>();
param.add(df.parse(now));
Coupon.find(" and expireStartDate >? ",param)
Coupon.find(" and expireStartDate >? ",param)
这样查询的结果也是正确的。