首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未为请求的操作找到编解码器:[UDT("keyspace".user_product_info) <-> Codec .user.UserProductInfo]

未为请求的操作找到编解码器:[UDT("keyspace".user_product_info) <-> Codec .user.UserProductInfo]
EN

Stack Overflow用户
提问于 2020-10-15 08:01:57
回答 1查看 679关注 0票数 1

发行:

我使用的是DataStax Java驱动程序4.9,我在键空间中声明了一个UDT user_product_info,它使用嵌套的UDTs......while运行它在执行以下行时未找到的代码

**

代码语言:javascript
复制
PreparedStatement preparedUpdateFriendRating = session.prepare("UPDATE friend_rating SET user_product_infos=:userproductinfos WHERE user_id=:userId ;");
preparedUpdateFriendRating.bind(new ArrayList(userProductInfo), id);

**

以下是shema.cql

代码语言:javascript
复制
CREATE TYPE IF NOT exists user_product_info (id text,short_product frozen < short_product>,test set < text >,ratings list< frozen < rating > >);

CREATE TABLE IF NOT exists friend_rating(user_id text,user_product_infos list < frozen < user_product_info >>,PRIMARY KEY (user_id));

CREATE TYPE IF NOT exists short_product (name text,specs SET < text >,img text);

具有相应的java类

代码语言:javascript
复制
//------------------------------------USER PRODUCT INFO-----------


@SchemaHint(targetElement = UDT)
public class UserProductInfo {

    @CqlName("id")
    private String productId;

    @CqlName("short_product")
    private ShortProduct shortProduct;

    @CqlName("test")
    private Set<String> test;

    @CqlName("ratings")
    private List<Rating> ratings;

    public UserProductInfo() {}

//with getters and setters
}

//---------------------------------------SHORT PRODUCT----------------

@SchemaHint(targetElement = UDT)
public class ShortProduct {
    @CqlName("name")
    private String name;

    @CqlName("specs")
    private Set<String> specs;

    @CqlName("img")
    private String imageUrl;

    public ShortProduct() {}
//with getters and setters
}

//--------------------------------------FRIEND RATING TABLE-------------------

@SchemaHint(targetElement = TABLE)
public class FriendRating {
    @PartitionKey
    @CqlName("user_id")
    private String userId;

    @CqlName("user_product_infos")
    private List<UserProductInfo> userProductInfos;

//with getters and setters
}
'''

具有以下堆栈跟踪的

代码语言:javascript
复制
com.datastax.oss.driver.api.core.type.codec.CodecNotFoundException: Codec not found for requested operation: [UDT("keyspace".user_product_info) <-> model.user.UserProductInfo]
    at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.createCodec(CachingCodecRegistry.java:609) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry$1.load(DefaultCodecRegistry.java:95) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry$1.load(DefaultCodecRegistry.java:92) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3527) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2276) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2154) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.get(LocalCache.java:2044) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache.get(LocalCache.java:3951) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache.getOrLoad(LocalCache.java:3973) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4957) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4963) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry.getCachedCodec(DefaultCodecRegistry.java:117) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.codecFor(CachingCodecRegistry.java:196) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.createCodec(CachingCodecRegistry.java:567) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry$1.load(DefaultCodecRegistry.java:95) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry$1.load(DefaultCodecRegistry.java:92) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3527) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2276) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2154) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.get(LocalCache.java:2044) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache.get(LocalCache.java:3951) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache.getOrLoad(LocalCache.java:3973) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4957) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4963) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry.getCachedCodec(DefaultCodecRegistry.java:117) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.codecFor(CachingCodecRegistry.java:258) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.internal.core.data.ValuesHelper.encodePreparedValues(ValuesHelper.java:112) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.internal.core.cql.DefaultPreparedStatement.bind(DefaultPreparedStatement.java:159) ~[java-driver-core-4.6.1.jar:na]
EN

回答 1

Stack Overflow用户

发布于 2020-10-15 08:59:08

要解决这个问题,您有两个备选方案:

  • 按照文档中的描述为您的UDT实现自定义代码(我不想从其中复制代码)。这是必需的,因为您使用的是核心API (session.execute)
  • 切换到使用目标映射器 -您将直接使用您的对象,加载和保存它们等等。您已经开始用@CqlName对对象进行注释,但是没有使用它们,因为您需要设置基于此注释生成代码的预处理器。(您也不需要为简单的字段名(例如,names等)提供注释。对于更复杂的名称,您可能也不需要这样做,因为对象映射程序有不同的命名翻译器,例如,从骆驼到蛇的案例等等)。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64367263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档