如何解决通过Java插入Orient DB的嵌入式列表
这是我用来创建必要类的sql脚本:
CREATE CLASS ProductSummary;
CREATE PROPERTY ProductSummary.name STRING (NOTNULL,MANDATORY TRUE);
CREATE PROPERTY ProductSummary.modelNumber LONG (NOTNULL,MANDATORY TRUE);
ALTER CLASS ProductSummary STRICTMODE TRUE;
CREATE CLASS PricingSummary;
CREATE PROPERTY PricingSummary.price LONG (NOTNULL,MANDATORY TRUE);
CREATE PROPERTY PricingSummary.discount LONG (NOTNULL,MANDATORY TRUE);
ALTER CLASS PricingSummary STRICTMODE TRUE;
CREATE CLASS TotalSummary EXTENDS V;
CREATE PROPERTY TotalSummary.projectLink LINK Project (NOTNULL,MANDATORY TRUE);
CREATE PROPERTY TotalSummary.productSummaries EMbedDEDLIST ProductSummary;
CREATE PROPERTY TotalSummary.pricingSummaries EMbedDEDLIST PricingSummary;
ALTER CLASS TotalSummary STRICTMODE TRUE;
CREATE INDEX TotalSummary_projectLink_idx ON TotalSummary (projectLink) UNIQUE;
我正在尝试将一些值插入我的TotalSummary类中,在这里我还需要将一些值插入EmbeddedList中,以用于pricesSummaries和productSummaries。
public TotalSummary create(final TotalSummary totalSummary) {
final Long projectId = 1;
final StatementBuilder builder = new StatementBuilder();
final StringBuilder query = new StringBuilder();
final List<Map<?,?>> productSummaries = totalSummary.getProductSummaries().stream()
.map(ProductSummary::toMap)
.collect(Collectors.toList());
final List<Map<?,?>> pricingSummaries = totalSummary.getPricingSummaries().stream()
.map(PricingSummary::toMap)
.collect(Collectors.toList());
builder.addAttribute("projectLink = (SELECT FROM project WHERE id = ?)",projectId);
if ( ! productSummaries.isEmpty()) {
builder.addAttribute("productSummaries = ?",productSummaries);
}
if ( ! pricingSummaries.isEmpty()) {
builder.addAttribute("pricingSummaries = ?",pricingSummaries);
}
try {
insert(TotalSummary.class.getSimpleName(),builder.attributes(),statement -> {
builder.init(statement);
return statement;
});
} catch (final UncategorizedsqlException e) {
throw new ConstraintViolationException(totalSummary,ExceptionUtils.getRootCauseMessage(e),e);
}
return assertNotNull(findById(projectId));
}
This is the utility method that I am using to build the insert query :
protected String insert(final String vertex,final String fieldValuePairs,final PreparedStatementinitializer initializer) {
final String sql = "INSERT INTO " + vertex + " SET " + fieldValuePairs + " RETURN @rid";
return executeStatement(sql,initializer);
}
The toMap methods to convert the List<ProductSummary> to List<Map<?,?>>
**ProductSummary**
public Map<String,Object> toMap() {
final Map<String,Object> ret = new HashMap<>();
ret.put("name",name);
ret.put("model number",Long.valueOf(modelNumber));
return ret;
}
The toMap methods to convert the List<PricingSummary> to List<Map<?,?>>
**PricingSummary**
public Map<String,Object> ret = new HashMap<>();
ret.put("price",Long.valueOf(price));
ret.put("discount",Long.valueOf(discount));
return ret;
}
我在执行代码时遇到以下异常
Constraint violation for: TotalSummary@58f79eeb[recordId=<null>,customProperties=[]]. Reason: ovalidationException: The field 'TotalSummary.productSummaries' has been declared as EMbedDEDLIST but an incompatible type is used.
我已经尝试过的东西:
解决方法
您将摘要定义为EMBEDDEDLIST ProductSummary
,但您正在将地图列表作为值传递。
尝试创建真实的ProductSummary
对象,例如。
OElement ret = db.newEmbeddedElement("ProductSummary");
ret.setProperty("price",Long.valueOf(price));
ret.setProperty("discount",Long.valueOf(discount));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。