我正在尝试创建一个简单的应用程序,以便我熟悉grails。 应用程序的功能是利润和日期的CRUD。我用日期作为主键。
我完成了添加和阅读,现在我正在处理删除部分。
这是示例数据库
> ----------------------------
>| date | profit |
> ----------------------------
>| 2015-08-01 | 4.45678 |
>| 2015-08-02 | 76.45678 |
>| 2015-08-03 | 567 |
>| 2015-08-04 | 6789.60 |
> ----------------------------
这是错误消息:
URI /SampleGrailsApp/dailyProfit/delete/2015-08-10%2000:00:00.0类 org.hibernate.TypeMismatchException消息提供的错误ID class samplegrailsapp.DailyProfit的类型。预期:上课 java.util.Date,得到类java.lang.Long
这是控制器
package samplegrailsapp
import java.text.DateFormat
import java.text.SimpleDateFormat
class DailyProfitController {
def scaffold = DailyProfit
def index() {
list()
}
def save() {
// Date myDate = params.date('test', 'yyyy-MM-dd');
params.date_month = (Integer.parseInt(params.date_month)<10)? "0" + params.date_month : params.date_month
params.date_day = (Integer.parseInt(params.date_day)<10)? "0" + params.date_day : params.date_day
params.date = params.date_year + "-" + params.date_month + "-" + params.date_day
def dailyProfit = new DailyProfit(params)
println params.toString()
dailyProfit.save()
list()
//render(view:"profitTable")
}
def list(){
def dailyProfit = DailyProfit.list()
render view:"profitTable", model: [dailyProfit : dailyProfit]
}
def delete(Date date){
def dailyProfit = DailyProfit.get(date)
dailyProfit.delete(flush: true)
list()
}
}
HTML文件
<table class="table table-hover table-bordered">
<thead>
<tr>
<th>Date</th>
<th>Profit</th>
<th>Delete?</th>
</tr>
</thead>
<tbody>
<g:each in="${dailyProfit}" var="dp">
<tr>
<td><g:formatDate format="yyyy-MM-dd" date="${dp.date}"/></td>
<td>
<g:formatNumber number="${dp.profit}" type="currency" currencyCode="PHP" format="###.##" />
</td>
<td>
<g:form controller="dailyProfit" action="delete" id="${dp.date}">
<g:actionSubmit value="Delete" >
<span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
</g:actionSubmit>
</g:form>
</td>
</tr>
</g:each>
</tbody>
</table>
这是DailyProfit.groovy
package samplegrailsapp
import java.text.DateFormat
import java.text.SimpleDateFormat
import org.grails.databinding.BindingFormat
class DailyProfit {
@BindingFormat('yyyy-MM-dd')
Date date;
double profit;
static constraints = {
date (blank:false, nullable:false, validator: {value, object ->
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
if((cal.getTime().before(value) )){
return false;
}
})
profit (blank:false, nullable:false, validator: {value, object ->
if (!value.toString().matches(/^([1-9]{1}[0-9]*\.{0,1}\d{0,5}|0\.[0-9]{1,2}|0|\.[0-9]{1,5})$/) ) return false;
})
}
static mapping = {
version false
//id generator:'assigned', name:'date'
id column: 'date', name: 'date', generator: 'assigned'
}
/*def beforeInsert() {
id = date
}*/
}
正如您所看到的,我在 yyyy-MM-dd 日期之前将此格式用于表格中。现在,对于位于表格最后一列的删除按钮,当我将其传递给动作时,它会获得原始格式,而不是 yyyy-MM-dd ,而且可能是为什么我得到不匹配错误。问题是我该怎么做才能在将日期传递给删除操作之前编辑日期?还是有另一种删除数据的方法?谢谢。
答案 0 :(得分:1)
您的 delete 控制器方法需要一个名为 date 的参数,但您的表单未提供参数。而是表单提供名为 id 的参数。要修复表单,请添加名称为 date 且值为 $ {dp.date} 的hidden字段。这会将DailyProfit的主键date映射到控制器方法中的date参数。
答案 1 :(得分:0)
我认为您的错误是在delete(Date date)
方法之前发生的,因为该参数显然是Date
而不是Long
。
但是如果要覆盖PreDelete事件,可以通过实现ApplicationListener<AbstractPersistenceEvent>
覆盖grails上的应用程序事件,并在resources.groovy
中注册该类。然后你可以像下面那样打断PreDelete
@Override
void onApplicationEvent(AbstractPersistenceEvent event) {
switch (event.eventType) {
\\case EventType.PostInsert:
\\ break
\\case EventType.PreUpdate:
\\ break
case EventType.PreDelete:
onPreDelete(event as PreDeleteEvent)
break
}
}
def onPreDelete(PreDeleteEvent event, final User user) {
def domain = event.entityObject
if(!domain instance of YourDomainClass)
return
//edit date in your domain before delete here
}
答案 2 :(得分:0)
一般情况下,我会说,指定日期格式和用途,
Date.format(dateFormatter, value)
将值解析为日期。例如,
class DailyProfitController {
//point of interest
String dateFormat = "yyyy-MM-dd"
def save() {
// Date myDate = params.date('test', 'yyyy-MM-dd');
params.date_month = (Integer.parseInt(params.date_month)<10)? "0" + params.date_month : params.date_month
params.date_day = (Integer.parseInt(params.date_day)<10)? "0" + params.date_day : params.date_day
//another point of interest
params.date = Date.parse(dateFormat, params.date_year + "-" + params.date_month + "-" + params.date_day)
def dailyProfit = new DailyProfit(params)
println params.toString()
dailyProfit.save()
list()
//render(view:"profitTable")
}