从ViewEntry获取Notes日期输入到JAVA日期

从ViewEntry获取Notes日期输入到JAVA日期,java,datetime,xpages,Java,Datetime,Xpages,我在Java方法中有以下代码块: colVal = ve.getColumnValues(); System.out.println("Got colVal"); System.out.println("Col values = " + colVal.toString()); try { Document pDoc = ve.getDocument(); System.out.println("Start MyDate");

我在Java方法中有以下代码块:

colVal = ve.getColumnValues();
    System.out.println("Got colVal");
    System.out.println("Col values = " + colVal.toString());
    try {
        Document pDoc = ve.getDocument();
        System.out.println("Start MyDate");
        DateTime dt = (DateTime) pDoc.getItemValueDateTimeArray("ExpPayDate").get(0);
        Date pDate = dt.toJavaDate();
        pItem.setMyDate(pDate);
    } catch (Exception e) {
                        // date error
    System.out.println("setMyDate Failed "+ e.toString());
    }
日志如下所示:

12/09/2015 02:49:59 PM  HTTP JVM: Got colVal
12/09/2015 02:49:59 PM  HTTP JVM: Col values = [1bp8frg61ze9s, 24/09/2015 12:00:00 PM MDT, , 0.0, ---, , --- No Agent ---, , ]
我使用ViewEntry是因为我需要维护视图排序顺序。 这样做的问题是
ve.getDocument()
意味着额外的服务器访问,并且可能会变得相当昂贵。 所以我尝试只使用colVal.get(1),它被视为Notes数据时间,但colVal.get(1).toJavaDate()似乎不可用

更改代码以尝试从colVal获取值:

System.out.println("Got colVal");
System.out.println("Col values = " + colVal.toString());
    try {
     System.out.println("Start MyDate");
    System.out.println("Get value from colVal " + colVal.get(1).toString());
                        //pItem.setMyDate(pDate);
    } catch (Exception e)
        System.out.println("setExpPayDate Failed "  + e.toString());
} 
运行此“从colVal获取值”时会导致错误:

12/09/2015 03:05:55 PM  HTTP JVM: Start MyDate
12/09/2015 03:05:55 PM  HTTP JVM: setMyDate Failed java.lang.ClassCastException: lotus.domino.local.DateTime incompatible with java.lang.String

我可以从文档中执行我需要的操作,但似乎无法从viewEntry和ve.getColumnValues()实现

直接的解决方案是,您需要将对象强制转换为
DateTime
,以便能够调用
toJavaDate
方法。例如:

DateTime dt = (DateTime)colVal.get(1);
Date date = dt.toJavaDate();
这是因为
getColumnValues
返回的
Vector
返回
对象类型的值,因为它可以混合


在这种特定情况下,还有一种方法可以直接获取列值作为
日期。如果在获取列值之前调用
entry.setPreferJavaDates(true)
,则日期/时间值将表示为
date
对象,而不是
DateTime
。无论如何,您仍然可能会将列值强制转换为
Date
,但这可能是一个小小的方便。它还消除了在循环中执行
entry.recycle(colVal)
的需要,以确保列值中的
DateTime
s被回收。

直接的解决方案是,您需要将对象强制转换为
DateTime
,以便能够调用
toJavaDate
方法。例如:

DateTime dt = (DateTime)colVal.get(1);
Date date = dt.toJavaDate();
这是因为
getColumnValues
返回的
Vector
返回
对象类型的值,因为它可以混合


在这种特定情况下,还有一种方法可以直接获取列值作为
日期。如果在获取列值之前调用
entry.setPreferJavaDates(true)
,则日期/时间值将表示为
date
对象,而不是
DateTime
。无论如何,您仍然可能会将列值强制转换为
Date
,但这可能是一个小小的方便。它还消除了在循环中执行
entry.recycle(colVal)
的需要,以确保列值中的
DateTime
s被回收。

Jesse——感谢您,这样做了。这是一段代码片段:ViewEntryCollection veCol=vwPayment.getAllEntriesByKey(lKey);而(ve!=null){ViewEntry tVE=ve;colVal=ve.getColumnValues();ve.setPreferJavaDates(true);PaymentItem pItem=new PaymentItem();colVal=ve.getColumnValues();Date dt=(Date)ve.getColumnValues().get(1);pItem.setExpPayDate(dt);pItem.setContract(colVal.get(7.toString());……Utils.recycleObjects(pItem,ve);ve=veCol.getnextery(tVE);}veCol.recycle();还有什么需要回收利用的吗?正如您所说,我不需要回收colVal。我认为回收视图条目应该在获取下一个条目之后进行,不是吗?但如果它按原样工作,可能就不行了。我也不认为pItem需要回收——回收是Notes对象特有的东西,因为它们的C端句柄。我一直使用这种结构。tVE=ve;做我的事;ve.recycle();ve=向量getnextery(tVE);有更好的方法吗?不,如果有效的话,没有理由改变它-我本以为会有“物体被移除或回收”的例外,但似乎我错了。杰西-谢谢。这是一段代码片段:ViewEntryCollection veCol=vwPayment.getAllEntriesByKey(lKey);而(ve!=null){ViewEntry tVE=ve;colVal=ve.getColumnValues();ve.setPreferJavaDates(true);PaymentItem pItem=new PaymentItem();colVal=ve.getColumnValues();Date dt=(Date)ve.getColumnValues().get(1);pItem.setExpPayDate(dt);pItem.setContract(colVal.get(7.toString());……Utils.recycleObjects(pItem,ve);ve=veCol.getnextery(tVE);}veCol.recycle();还有什么需要回收利用的吗?正如您所说,我不需要回收colVal。我认为回收视图条目应该在获取下一个条目之后进行,不是吗?但如果它按原样工作,可能就不行了。我也不认为pItem需要回收——回收是Notes对象特有的东西,因为它们的C端句柄。我一直使用这种结构。tVE=ve;做我的事;ve.recycle();ve=向量getnextery(tVE);有更好的方法吗?不,如果它有效,没有理由改变它-我本以为会有“对象已被移除或回收”的例外,但似乎我错了。