我有2个类扩展了基类。

Questions.java

@Entity
@Table(name="question")
@Access(value = AccessType.FIELD)
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Questions{

    private static final long serialVersionUID = 1L;

    private String qid;

    @Column(name="addedtime")
    private String addedtime;

    @Column(name="qlang")
    private String qlang;

    @Id
    @Column(name="qid")
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Access(value = AccessType.PROPERTY)
    public String getQid() {
        return qid;
    }

    public void setQid(String qid) {
        this.qid = qid;
    }

    @Access(value = AccessType.PROPERTY)
    public String getAddedtime() {
        return addedtime;
    }

    public void setAddedtime(String addedtime) {
        this.addedtime = addedtime;
    }

    @Access(value = AccessType.PROPERTY)
    public String getQlang() {
       return qlang;
    }

    public void setQlang(String qlang) {
       this.qlang = qlang;
    }
}


MCQ.java,TwoMarkQ.java-所有2个类都扩展了Question.java。

MCQ.java

@Entity
@Table(name="MCQ")
@Access(value = AccessType.FIELD)
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class MCQ extends Questions implements Serializable{

    @Column(name="option_1")
    @Access(value = AccessType.FIELD)
    private String option_1;

    @Access(value = AccessType.PROPERTY)
    public String getOption_1() {
        return option_1;
    }

    public void setOption_1(String option_1) {
        this.option_1 = option_1;
    }

    @Column(name="option_2")
    @Access(value = AccessType.FIELD)
    private String option_2;

    @Access(value = AccessType.PROPERTY)
    public String getOption_2() {
        return option_2;
    }

    public void setOption_2(String option_2) {
        this.option_2 = option_2;
    }

}


TwoMarkQ.java

@Entity
@Table(name="TwoMarkQ")
@Access(value = AccessType.FIELD)
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class TwoMarkQ extends Questions implements Serializable{

    @Column(name="option_1")
    @Access(value = AccessType.FIELD)
    private String option_1;

    @Access(value = AccessType.PROPERTY)
    public String getOption_1() {
        return option_1;
    }

    public void setOption_1(String option_1) {
        this.option_1 = option_1;
    }

    @Column(name="option_2")
    @Access(value = AccessType.FIELD)
    private String option_2;

    @Access(value = AccessType.PROPERTY)
    public String getOption_2() {
        return option_2;
    }

    public void setOption_2(String option_2) {
        this.option_2 = option_2;
    }

}


所有这三个表都映射到MySQL数据库中的唯一表。

以下是每个表的show create table的结果

create table `question` (
  `qid` varchar(48) COLLATE utf8mb4_unicode_ci NOT NULL,
  `addedtime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  `qtype` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `qlang` varchar(48) COLLATE utf8mb4_unicode_ci NOT NULL,
   PRIMARY KEY (`qid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

create table `MCQ`(
`qid` varchar(48) COLLATE utf8mb4_unicode_ci NOT NULL,
`option_1` bigint(20) DEGAULT `0`,
`option_2` bigint(20) DEGAULT `0`,
PRIMARY KEY (`qid`),
CONSTRAINT `mcq_ibfk1` FOREIGN KEY (`qid`) REFERENCES `question` (`qid`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

create table `TwoMarkQ`(
`qid` varchar(48) COLLATE utf8mb4_unicode_ci NOT NULL,
`option_1` bigint(20) DEGAULT `0`,
`option_2` bigint(20) DEGAULT `0`,
PRIMARY KEY (`qid`),
CONSTRAINT `two_markq_ibfk1` FOREIGN KEY (`qid`) REFERENCES `question` (`qid`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci


在DAO类之一中,SQL查询是这样的(SQL查询针对派生类)

Query query = session.createQuery("select q.qid, q.qtype from Questions q where q.qlang=:lang ORDER BY q.addedtime ASC");
            query.setParameter("lang", lang);
            query.setFirstResult(startingRow).setMaxResults(10);
            result = (List<Questions>) query.list();


上一行result = (List<Questions>) query.list();中发生错误


  com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:未知
  “字段列表”中的“ qid”列


问题
1)为什么我得到com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'addedtime' in 'field list'以及如何解决?

请帮忙。打了3天。

PS:我正在使用Hibernate 4.3.5.Final版本

PS:这是生成的查询

select questions0_.qid as col_0_0_, questions0_.qtype as col_1_0_ from ( select qid, addedtime, qlang, qtype, null as option_1, null as option_2 as class_ from MCQ union  select qid, addedtime, qlang, qtype, null as option_!, null as option_2 as class_ from TwoMarkQ)  questions0_ where questions0_.qlang=? order by questions0_.addedtime ASC limit ?


由于Query query = session.createQuery("select q.qid, q.qtype from Questions q where q.qlang=:lang ORDER BY q.addedtime ASC");位于基类上,因此看起来它正在与所有子类建立联合,并且子类没有addtime列。我只是在猜。

最佳答案

那么该错误是由于以下事实造成的:在休眠所映射的表中没有列,即通常默认的字段采用该属性的名称。
我想问你的第一个问题是数据库中已经存在该表?为什么在进行任何需要了解的对象映射操作之前先进行hibenate操作,并且在正常的Hibernate中使用这些类让自己映射到他。
因此,当我能找到有关休眠的解决方案时,您应该在数据库上映射一个单独的类,然后再将“支持类”映射到您的实际模型。
键入从服务器获取数据且数据不反映当前模型的解决方案。

希望我已经回答了您的问题,并能提供帮助。

PS:尝试检查您的数据库休眠是否未创建其他关系选项卡。

10-08 13:28