是否有推荐的方法来处理没有带有spring-data-couchbase(如果有)的_class
字段的文档?尝试仅会按预期抛出异常。
编辑:抱歉,如果这有点太含糊,让我添加更多背景信息。 我想按名称从某位学生那里获取数据。存储库看起来像-
@存储库
公共接口StudentRepository扩展了CouchbaseRepository {
Optional<StudentDocument> findByName(String name);
}
现在,couchbase中的文档没有_class字段,或者说我们不想为_class字段输入另一个“键”和“值”,因为我们不想依赖它,因此此方法失败。我使用-
破解了一种解决方法`
@Override
public Student getStudent(String name) {
N1qlQuery query = N1qlQuery.simple(String.format("select *, META().id AS _ID, META().cas AS _CAS" +
" from student where name = \'%s\';", name));
return Optional.ofNullable(studentRepository.getCouchbaseOperations()
.findByN1QL(query, StudentWrapper.class)
.get(0))
.map(StudentWrapper::getStudent)
.orElseGet(() -> {
throw new HttpClientErrorException(HttpStatus.NOT_FOUND);
});
}
`
我想知道是否还有另一种方法可以实现这一目标
答案 0 :(得分:0)
使用Spring spEL时,Couchbase会自动为您包括_class(或您定义为类型的任何属性):
public interface AreaRepository extends CouchbaseRepository<Area, String> {
//The _class/type is automatically included by Couchbase
List<Area> findByBusinessUnityIdAndRemoved(String businessId, boolean removed);
}
但是,如果要使用N1QL,则必须添加#{#n1ql.filter}:
public interface BusinessUnityRepository extends CouchbaseRepository<BusinessUnity, String>{
@Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and companyId = $2 and $1 within #{#n1ql.bucket}")
BusinessUnity findByAreaRefId(String areaRefId, String companyId);
}
#{#n1ql.filter}将为您自动按类型添加过滤器。