2013-08-30 86 views
0

我很喜欢这个问题。请帮忙。Cayenne SQLTemplate返回不正确的结果

sql = "SELECT * FROM scheduler_assignment a WHERE a.start < #bind($end)"; 
SQLTemplate query = new SQLTemplate(Assignment.class, sql); 
query.setFetchingDataRows(true); 
Map<String, Object> params = new HashMap<String, Object>(); 
params.put("end", end); 
query.setParameters(params); 
ObjectContext context = BaseContext.getThreadObjectContext(); 
List<DataRow> rows = context.performQuery(query); 

end是Date对象。当我将end更改为等效字符串时,查询正常工作。有谁知道为什么传入Date对象不能用于绑定指令?谢谢!

回答

1

第一种可能性:'scheduler_assignment.start'列不是数据库中的日期。它可能是一个VARCHAR或其他东西。

如果不是这种情况,您可能必须在Cayenne的#bind指令中传递参数类型以使用正确的驱动程序方法。例如:

#bind($end 'TIMESTAMP') 
+0

谢谢你看我的问题。我验证了scheduler_assignment.start是MySQL数据库中的DATETIME数据类型。我把你的例子的类型的参数,但我仍然得到错误的结果。这是执行的SQL的日志。当我从MySQL Workbench运行查询时,我收到一行。当我使用上面的代码运行相同的查询时,我得到零行。 'SELECT * FROM scheduler_assignment a WHERE a.start <? [bind:1:'2013-08-31 23:00:00']' – Tuan

+0

它可以转换到不同的时区吗? – Tuan

+0

http://objectstyle.org/cayenne/lists/cayenne-user/2007/08/0027.html – Tuan