gpt4 book ai didi

java - 2 个 POJO 类扩展了一个基类,其中每个类都映射到唯一的表。为什么 hibernate 查询在“字段列表错误”中创建​​未知列 ''?

转载 作者:行者123 更新时间:2023-11-30 21:42:38 24 4
gpt4 key购买 nike

我有 2 个扩展基类的类。

问题.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;
}

}

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

下面是show create table for each 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: Unknown column 'qid' in 'field list'

问题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");在基类上,看起来它正在与所有子类联合,而子类没有 addedtime 列。我只是猜测。

最佳答案

那么错误是由于hibernate映射的表中没有列,即通常默认的字段采用属性的名称。我想问你的第一个问题是该表已经存在于数据库中??你为什么在做任何事情之前先 hibernate ,你需要知道你在映射谁,在正常的 hibernate 中使用类让自己映射到他。因此,当我找到有关 hibernate 的信息来解决您要解决的问题时,您应该将一个类映射到您在数据库中拥有的类,然后再将“支持类”映射到您的实际模型。键入从服务器获取数据时使用的解决方案,但该数据不反射(reflect)您当前的模型。

希望我的回答与您的问题一致,并且对您有所帮助。

PS: 尝试检查你的 db hibernate 是否没有创建其他关系标签。

关于java - 2 个 POJO 类扩展了一个基类,其中每个类都映射到唯一的表。为什么 hibernate 查询在“字段列表错误”中创建​​未知列 ''?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50872764/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com