我正在尝试返回一个 JodaTime DateTime 对象。它适用于下面的 Effective_date 字段。但我不确定如何让它为 Event 对象返回 DateTime。有任何想法吗?
String sql = "SELECT a.availability_id, a.event_id, a.availability_set_id, "
+ "e.event_id, "
+ "#result('e.start' 'org.joda.time.DateTime' '' 'event.start'), "
+ "#result('e.end' 'org.joda.time.DateTime' '' 'event.end'), "
+ "e.recurrence_id, "
+ "e.sequence, "
+ "e.uid, "
+ "#result('effective_date' 'org.joda.time.DateTime' '' 'effective_date'), "
+ "#result('next_effective_date' 'org.joda.time.DateTime' '' 'next_effective_date') "
<snip>
EntityResult eventResult = new EntityResult(Event.class);
eventResult.addDbField(Event.EVENT_ID_PK_COLUMN, "event_id");
eventResult.addObjectField(Event.START_PROPERTY, "start");
eventResult.addObjectField(Event.END_PROPERTY, "end")
<snip>
SQLResult resultDescriptor = new SQLResult();
resultDescriptor.addEntityResult(availabilityResult);
resultDescriptor.addEntityResult(eventResult);
<snip>
List<Object[]> dataList = context.performQuery(query);
for (Object[] data : dataList) {
Event event = (Event) data[1];
event.getStart(); // Runs into class cast error where it's returning Date instead of DateTime
}
编辑:
我已经将 Joda DateTime 添加到 ExtendedType。仅当我使用 SQLResult 构建 Event 对象时,才会出现上述问题。
// create custom ExtendedType instance
ExtendedType dateTimeType = new DateTimeType();
DataNode node = domain.getNode("MySQLNode");
// install ExtendedType
node.getAdapter().getExtendedTypes().registerType(dateTimeType);
当不使用 SQLResult 实例化 Event 对象时,它工作得很好。在这里,Cayenne Modeler 生成了具有 DateTime 返回类型的 _Event 类。
public abstract class _Event extends CayenneDataObject {
<snip>
public void setStart(DateTime start) {
writeProperty("start", start);
}
public DateTime getStart() {
return (DateTime)readProperty("start");
}