代码之家  ›  专栏  ›  技术社区  ›  Hossein Mobasher

数据类型不一致:预期的TIMESTAMP得到的是数字

  •  0
  • Hossein Mobasher  · 技术社区  · 4 年前

    我正在使用 Hibernate 5.3.10 作为我在基于Spring引导的项目中的ORM。假设我们有以下实体:

    @Entity
    @Table(name = "parent")
    @Inheritance(strategy = InheritanceType.JOINED)
    public class Parent {
        @EmbeddedId
        private EmbId id;
    
        public Id getId() { return id; }
        public void setId(Id id) { this.id = id; }
    }
    
    @Entity
    @Table(name = "child")
    @PrimaryKeyJoinColumns({
        @PrimaryKeyJoinColumn(name = "id"),
        @PrimaryKeyJoinColumn(name = "date_time")
    })
    public class Child {
        @EmbeddedId
        private EmbId id;
    
        private String name;
    
        public Id getId() { return this.id; }
        public void setId(Id id) { this.id = id; }
    
        public String getName() { return this.name; }
        public void setName(String name) { this.name = name; }
    }
    

    可嵌入密钥如下:

    @Embeddable
    public class EmbId {
        @Column(name = "id")
        private Long id;
    
        @Column(name = "date_time")
        private Date dateTime;
    
        public Long getId() { return this.id; }
        public void setId(Long id) { this.id = id; }
    
        public Date getDateTime() { return this.dateTime; }
        public void setDateTime(Date dateTime) { this.dateTime = dateTime; }
    }
    

    当我想对上进行多态查询时 Child 实体,JPA面对ORA-00932 Inconsistent datatypes: expected TIMESTAMP got NUMBER 在控制台中看到了以下sql:

    select child0_.id as date_time1_25_0, child0_.date_time as id2_25_0, child0_1_.name as name3_3_0 from my_schema.child child0_ inner join my_schema.parent child0_1_ on child0_.id = child0_1_.date_time and child0_.date_time = child0_1_.id
    

    ID的平等似乎被取代了。发生了什么,我应该做些什么来解决这个问题?

    提前感谢。

    0 回复  |  直到 4 年前
        1
  •  0
  •   Hossein Mobasher    4 年前

    幸运的是,我发现添加 referencedColumnName 属性为 @PrimaryKeyJoinColumn 可以引导hibernate在正确的位置使用ID。

    所以 Child 类应该如下:

    @Entity
    @Table(name = "child")
    @PrimaryKeyJoinColumns({
        @PrimaryKeyJoinColumn(name = "id"),
        @PrimaryKeyJoinColumn(name = "date_time")
    })
    public class Child {
        @EmbeddedId
        private EmbId id;
    
        private String name;
    
        public Id getId() { return this.id; }
        public void setId(Id id) { this.id = id; }
    
        public String getName() { return this.name; }
        public void setName(String name) { this.name = name; }
    }