我在尝试从CouchBase获取对象时遇到异常。我使用Spring Data Repository来查询数据。我将数据保存到CouchBase,没有任何例外。我需要按dataTime
查询数据,该数据应在dateBefore
和dateAfter
范围内。
我有这样的Java对象:
@Document
public class DataObject{
@Id
@Field
private String dataId;
@Field
private boolean isEnabled;
@Field
private BigDecimal price;
@Field
private LocalDateTime dataTime;
@Field
private Currency currency;
public DataObject() {
}
public DataObject(String dataId, boolean isEnabled, BigDecimal price, Date dataTime, Currency currency) {
this.dataId = dataId;
this.dataId = dataId;
this.price = price;
this.dataTime = dataTime;
this.currency = currency;
}
}
我有这样的存储库界面:
public interface DataObjectRepository extends CrudRepository<DataObject, String> {
@Query("#{#n1ql.selectEntity} WHERE dataTime BETWEEN $1 AND $2 AND #{#n1ql.filter}")
List<DataObject> getDataObjectsBetweenDates(LocalDateTime beforeTime, LocalDateTime afterTime);
}
当我运行此查询时,我得到一个例外:
org.springframework.web.util.NestedServletException:Request 处理失败;嵌套异常是 java.lang.IllegalArgumentException:JsonArray的不支持的类型: class java.time.LocalDateTime
我尝试使用Timestamp
,旧日期而不是LocalDateTime
,但我得到了相同的例外,但邮件中有不同的类。
我是CouchBase的新手,所以感谢任何帮助
答案 0 :(得分:0)
您遇到了此异常,因为Couchbase Java客户端尝试将您的beforeTime
添加到parameters数组,但是无法执行此操作。 LocalDateTime
类型不受支持,并且不满足客户端内部的此检查要求:
public static boolean checkType(Object item) {
return item == null
|| item instanceof String
|| item instanceof Integer
|| item instanceof Long
|| item instanceof Double
|| item instanceof Boolean
|| item instanceof BigInteger
|| item instanceof BigDecimal
|| item instanceof JsonObject
|| item instanceof JsonArray;
}
将LocalDateTime
保存到沙发床时,spring会将其转换为Long
:
Date.from(source.atZone(systemDefault()).toInstant()).getTime();
因此,您还可以使用这种方法转换日期并发送Long
参数而不是LocalDateTime