IllegalArgumentException:列名不是此 UDT 中定义的字段

IllegalArgumentException: columnname is not a field defined in this UDT

我有以下table结构

@Table(value = "employee")
public class Employee implements MapIdentifiable{

    @PrimaryKeyColumn(value = "employee_id", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
    private String empId;

    @Column(value="info")
    @CassandraType(type = DataType.Name.UDT, userTypeName = "emp_info")
    private EmployeeInfo info;

// getters & setters
}

@UserDefinedType(value = "emp_info")
public class EmployeeInfo {

  @CassandraType(type = DataType.Name.TEXT, userTypeName = "employee_name")
  private String employeeName

// getters & setters
}

每当我尝试执行 repository.save(emp) 时,我都会收到以下错误 IllegalArgumentException: employeename is not a field defined in this UDT.

我的代码或数据库中没有引用任何名为 'employeename' 的字段,但我收到上述错误。

我已经尝试过,重新创建整个模式和 tables 但没有成功。

我的maven依赖如下

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-cassandra</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.datastax.cassandra</groupId>
            <artifactId>cassandra-driver-core</artifactId>
            <version>3.7.1</version>
        </dependency>
        <dependency>
            <groupId>com.datastax.cassandra</groupId>
            <artifactId>cassandra-driver-mapping</artifactId>
            <version>3.7.1</version>
        </dependency>
        <dependency>
            <groupId>com.datastax.cassandra</groupId>
            <artifactId>cassandra-driver-extras</artifactId>
            <version>3.7.1</version>
        </dependency>

如果我从我的字段名称中删除下划线,则相同的代码会起作用。我无法弄清楚我的代码不能在我的字段名称中使用下划线。

如果我遗漏了任何要分享的信息,请告诉我。

我的堆栈跟踪,

java.lang.IllegalArgumentException: employeename is not a field defined in this UDT
web_1  |    at com.datastax.driver.core.UDTValue.getAllIndexesOf(UDTValue.java:47)
web_1  |    at com.datastax.driver.core.AbstractData.set(AbstractData.java:535)
web_1  |    at org.springframework.data.cassandra.core.convert.MappingCassandraConverter.writeUDTValueWhereFromObject(MappingCassandraConverter.java:495)
web_1  |    at org.springframework.data.cassandra.core.convert.MappingCassandraConverter.write(MappingCassandraConverter.java:353)
web_1  |    at org.springframework.data.cassandra.core.convert.MappingCassandraConverter.getWriteValue(MappingCassandraConverter.java:769)
web_1  |    at org.springframework.data.cassandra.core.convert.MappingCassandraConverter.getWriteValue(MappingCassandraConverter.java:711)
web_1  |    at org.springframework.data.cassandra.core.convert.MappingCassandraConverter.writeMapFromWrapper(MappingCassandraConverter.java:368)
web_1  |    at org.springframework.data.cassandra.core.convert.MappingCassandraConverter.write(MappingCassandraConverter.java:343)
web_1  |    at org.springframework.data.cassandra.repository.support.InsertUtil.createInsert(InsertUtil.java:52)
web_1  |    at org.springframework.data.cassandra.repository.support.SimpleCassandraRepository.createInsert(SimpleCassandraRepository.java:110)
web_1  |    at org.springframework.data.cassandra.repository.support.SimpleCassandraRepository.save(SimpleCassandraRepository.java:77)
web_1  |    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
web_1  |    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
web_1  |    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
web_1  |    at java.lang.reflect.Method.invoke(Method.java:498)
web_1  |    at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:377)
web_1  |    at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:200)
web_1  |    at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:641)
web_1  |    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
web_1  |    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:605)
web_1  |    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:590)
web_1  |    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
web_1  |    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59)
web_1  |    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
web_1  |    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
web_1  |    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
web_1  |    at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61)
web_1  |    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
web_1  |    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
web_1  |    at com.sun.proxy.$Proxy136.save(Unknown Source)
web_1  |    at com.hindol.service.EmployeeServiceImpl.createEmployee(EmployeeServiceImpl.java:31)
web_1  |    at com.hindol.EmployeeController.saveEmployee(EmployeeController.java:72)

employeename 来自映射的 UDT EmployeeInfo 因为它包含 属性

private String employeeName

要更改 UDT 字段的名称,请联系我们@Column(…)

在我向我的@UserDefinedType class 添加另一个字段后尝试 运行 我的 Spring 应用程序时出现此错误。我的 Spring 应用没有更新我的 UDT 结构,所以我必须手动更新。

如果您的项目是全新的,您只需从 Cassandra 中删除 table 和 UDT,然后让您的 Spring 应用程序再次 运行 重新创建数据模型:

DROP TABLE employee;

DROP TYPE emp_info;

但是,如果您不能简单地删除并重新创建 table,则必须使用 ALTER TYPE 命令来更新您的 UDT 结构。有关详细信息,请参阅 documentation