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。
我有以下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。