You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data Couchbase 4.4.5中getCouchbaseOperations()问题求助

Spring Data Couchbase 4.4.5迁移:解决getCouchbaseOperations()移除后的依赖问题

Spring Data Couchbase 4.4.5官方文档明确移除了getCouchbaseOperations()方法,官方说明可通过CouchbaseTemplate或Cluster类访问原生Java SDK的所有方法。我基于Couchbase SDK 2实现的代码,已经按照相关指引迁移了弃用的DSL包,但仍面临getCouchbaseOperations()相关的依赖问题,以下是原代码及解决方案:

原问题代码

package com.acme.acmepay.config.dao;

import com.acme.acmepay.config.document.paymentoption.PaymentGatewayConfiguration;
import com.acme.acmepay.config.logic.paymenttemplatereportlogic.data.PaymentTemplateDataTableSearchLogicData;
import com.acme.acmepay.config.repository.PaymentGatewayConfigurationRepository;
import com.couchbase.client.java.Bucket;
import com.couchbase.client.java.query.N1qlQuery;
import com.couchbase.client.java.query.Statement;
import com.couchbase.client.java.query.dsl.Expression;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.couchbase.repository.query.support.N1qlUtils;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@Slf4j
public class PaymentTemplateConfigDAOImpl implements PaymentTemplateConfigDAO {

    @Autowired
    PaymentGatewayConfigurationRepository paymentGatewayConfigurationRepository;

    Bucket couchbaseBucket;

    public List<PaymentGatewayConfiguration> getPaymentTemplateSearchReportList(
            PaymentTemplateDataTableSearchLogicData paymentTemplateDataTableSearchLogicData) {


        Statement statement = getQueryStatement(paymentTemplateDataTableSearchLogicData);
        log.info("N1QL Statement" + statement);

      //Error happen here
        N1qlQuery query = N1qlQuery.simple(statement);
        
        return paymentGatewayConfigurationRepository.getCouchbaseOperations().findByN1QL(query,
                PaymentGatewayConfiguration.class);


    }
    
    private Statement getQueryStatement(
            PaymentTemplateDataTableSearchLogicData paymentTemplateDataTableSearchLogicData) {

        //Error happen here
        return N1qlUtils
                .createSelectClauseForEntity(
                        paymentGatewayConfigurationRepository.getCouchbaseOperations().getCouchbaseBucket().name())
                .from(Expression
                        .i(paymentGatewayConfigurationRepository.getCouchbaseOperations().getCouchbaseBucket().name()))
                .where(paymentTemplateDataTableSearchLogicData.getSearchQuery())
                .orderBy(paymentTemplateDataTableSearchLogicData.getSort())
                .limit(paymentTemplateDataTableSearchLogicData.getLimit())
                .offset(paymentTemplateDataTableSearchLogicData.getOffset());

    }
}

解决方案

1. 注入CouchbaseTemplate替代getCouchbaseOperations()

Spring Data Couchbase 4.x中,Repository不再提供getCouchbaseOperations()方法,直接注入CouchbaseTemplate来获取操作能力:

@Autowired
private CouchbaseTemplate couchbaseTemplate;

2. 调整N1QL查询实现

SDK 3.x中N1qlQuery已被替换为Query类,同时findByN1QL方法对应调整为findByQuery,结合CouchbaseTemplate实现查询。

3. 替换Bucket获取方式

通过CouchbaseTemplate获取Bucket(适配SDK 3.x的API):

Bucket bucket = couchbaseTemplate.getBucket();

修改后的完整代码

package com.acme.acmepay.config.dao;

import com.acme.acmepay.config.document.paymentoption.PaymentGatewayConfiguration;
import com.acme.acmepay.config.logic.paymenttemplatereportlogic.data.PaymentTemplateDataTableSearchLogicData;
import com.acme.acmepay.config.repository.PaymentGatewayConfigurationRepository;
import com.couchbase.client.java.Bucket;
import com.couchbase.client.java.query.Query;
import com.couchbase.client.java.query.Statement;
import com.couchbase.client.java.query.dsl.Expression;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.couchbase.core.CouchbaseTemplate;
import org.springframework.data.couchbase.repository.query.support.N1qlUtils;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@Slf4j
public class PaymentTemplateConfigDAOImpl implements PaymentTemplateConfigDAO {

    @Autowired
    PaymentGatewayConfigurationRepository paymentGatewayConfigurationRepository;
    
    @Autowired
    private CouchbaseTemplate couchbaseTemplate;

    public List<PaymentGatewayConfiguration> getPaymentTemplateSearchReportList(
            PaymentTemplateDataTableSearchLogicData paymentTemplateDataTableSearchLogicData) {

        Statement statement = getQueryStatement(paymentTemplateDataTableSearchLogicData);
        log.info("N1QL Statement: {}", statement);

        Query query = Query.simple(statement);
        return couchbaseTemplate.findByQuery(PaymentGatewayConfiguration.class).matching(query).all();
    }
    
    private Statement getQueryStatement(
            PaymentTemplateDataTableSearchLogicData paymentTemplateDataTableSearchLogicData) {

        Bucket bucket = couchbaseTemplate.getBucket();
        return N1qlUtils
                .createSelectClauseForEntity(bucket.name())
                .from(Expression.i(bucket.name()))
                .where(paymentTemplateDataTableSearchLogicData.getSearchQuery())
                .orderBy(paymentTemplateDataTableSearchLogicData.getSort())
                .limit(paymentTemplateDataTableSearchLogicData.getLimit())
                .offset(paymentTemplateDataTableSearchLogicData.getOffset());
    }
}

额外注意事项

  • 确保项目依赖的Couchbase SDK版本与Spring Data Couchbase 4.4.5兼容(需使用SDK 3.x版本)
  • 若N1qlUtils.createSelectClauseForEntity在新版本中存在调整,可直接使用DSL构建SELECT语句,或参考官方文档的查询构建方式

内容的提问来源于stack exchange,提问作者Gehan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:55:23