Datastax 映射器抱怨生成的插入语句中有重复的列

Datastax mapper complains about duplicate columns in generated insert statement

版本:Datastax Java 驱动程序 3.1.4,Cassandra 3.10

考虑以下 table:

create table object_ta
(
  objid         bigint,
  version_date  timestamp,
  objecttype    ascii,
  primary key  (objid, version_date)
);

和映射 class:

@Table(name = "object_ta")
public class ObjectTa
{
    @Column(name = "objid")
    private long objid;
    @Column(name = "version_date")
    private Instant versionDate;
    @Column(name = "objecttype")
    private String objectType;

    public ObjectTa()
    {
    }

    public ObjectTa(long objid)
    {
        this.objid = objid;
        this.versionDate = Instant.now();
    }

    public long getObjId()
    {
        return objid;
    }

    public void setObjId(long objid)
    {
        this.objid = objid;
    }

    public Instant getVersionDate()
    {
        return versionDate;
    }

    public void setVersionDate(Instant versionDate)
    {
        this.versionDate = versionDate;
    }

    public String getObjectType()
    {
        return objectType;
    }

    public void setObjectType(String objectType)
    {
        this.objectType = objectType;
    }
}

为此 class 创建映射器后(mmMappingManager 用于 mykeyspace 上的会话)

final Mapper<ObjectTa> mapper = mm.mapper(ObjectTa.class);

通话中

mapper.save(new ObjectTa(1));

我明白了

Query preparation failed: INSERT INTO mykeyspace.object_ta (objid,objid,version_date,objecttype) VALUES (?,?,?,?);: com.datastax.driver.core.exceptions.InvalidQueryException: The column names contains duplicates at com.datastax.driver.core.Responses$Error.asException(Responses.java:136) at com.datastax.driver.core.SessionManager.apply(SessionManager.java:220) at com.datastax.driver.core.SessionManager.apply(SessionManager.java:196) at com.google.common.util.concurrent.Futures$ChainingListenableFuture.run(Futures.java:906) at com.google.common.util.concurrent.Futures.run(Futures.java:635) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137) at java.lang.Thread.run(Thread.java:745)

我很困惑,为什么在查询中会生成重复的objid

提前感谢您对问题的指点。

克莱门斯

我认为这是因为字段名称 (objid) 与 setter/getters (getObjId) 的大小写使用不一致。如果您将 getObjIdsetObjId 分别重命名为 getObjidsetObjid,我相信它可能会起作用。

在未来的版本中,驱动程序映射器将允许用户更明确地说明是否使用 setters/getters (JAVA-1310) and what the naming conventions are (JAVA-1316)。