Kotlin 中的 Spring:使用特殊查询从 couchbase 服务器获取数据会返回一个空对象

问题描述 投票:0回答:1

我有一个 Spring 微服务,已经运行了几个月了。 业主想添加 2 个附加功能,其中之一需要自定义查询:

SELECT Meta().id AS __id, *
FROM `bucket`
WHERE _class = "com.....CurrencyDominationDao"
AND lastUpdated >= $1 AND storeId = $2"

该查询在 couchbase 在线查询部分中运行良好,它根据需要检索数据。 但是当我从 spring 使用它时,我得到一个空的 Dao 对象,只有其中的文档 ID。 相同的 Dao 对象用于其他查询并正确获取数据。 我使用

service
层从存储库请求数据,来自存储库的数据是空的,它与 Dao 对象默认值匹配。

我检查了couchbase中的查询日志,成功了。没有任何错误。

只有当涉及到这个查询时,我才会得到一个带有文档 ID 的空 Dao 对象。

我多次测试了该查询。每次它都会带回应从数据库中获取的正确数量的数据对象,但它们都是空的。

我使用反应式结构,使用协程流。

这怎么可能? 我该如何解决?

spring-data couchbase kotlin-flow sql++ spring-data-couchbase
1个回答
0
投票

如果我不得不猜测,那是因为直接查询字段意味着您将获得包含在结果顶层的存储桶名称(或 Server 7+ 中的集合名称)。这可能无法正确序列化。因此,我建议(出于这个原因以及一般的可读性)使用别名。

例如,这个查询:

select * from `travel-sample`.inventory.hotel limit 10;
返回结果如下:

[ { "hotel": { "name": "Medway Youth Hostel", "address": "Capstone Road, ME7 3JE", // ... etc ... } }, { "hotel": { "name": "The Balmoral Guesthouse", "address": "57-59 Balmoral Road, ME7 4NT", // ... etc ... } ]
虽然这个查询:

select h.* from `travel-sample`.inventory.hotel h limit 10;
返回结果如下:

[ { "name": "Medway Youth Hostel", "address": "Capstone Road, ME7 3JE", // ... etc ... }, { "name": "The Balmoral Guesthouse", "address": "57-59 Balmoral Road, ME7 4NT", // ... etc ... } ]
所以,我建议您尝试一下,看看是否有效。

另外,可能与您的问题无关,我会确保仔细检查您是否确实需要此查询返回的

every 字段(即 SELECT *

)。如果您只需要几个字段,则会产生大量额外开销,而较少的字段(与
覆盖索引相结合)可以为您带来更好的性能。

© www.soinside.com 2019 - 2024. All rights reserved.