【问题标题】:Identical field names causing error in system相同的字段名称导致系统错误
【发布时间】:2018-10-02 07:20:52
【问题描述】:

问题本身将不断更新,直到错误清除为止。

几个月前,我们最近对我们的系统进行了升级,从 JBoss 升级到 Wildfly,从那以后我们的系统就出现了故障。

假设我有以下表格

CREATE TABLE students(
    ID int,
    Classid int,
    Name varchar(50),
    Version int
)

CREATE TABLE classstudent(
    ID int,
    Classname varchar(50),
    Version int
)

我编写了以下查询并且它有效

select *
from students

我写了以下,但它不起作用

select *
from students s
join classStudent cs on cs.id = s.classid

所以我决定选择每个字段

select s.id,s.classid,c.name,s.version,cs.id,cs.classname,cs.version
from students s
join classStudent cs on cs.id = s.classid

我仍然得到一个错误,所以我决定从每个表中选择 2 个 ID

select s.id,cs.id
from students s
join classStudent cs on cs.id = s.classid

我又遇到了一个错误,但后来我将 id 重命名为不同的名称

select s.id as sid,cs.id as csid
from students s
join classStudent cs on cs.id = s.classid

此查询有效,因此很明显,只要任一表上的字段名称相同,系统就会抛出错误。

这是什么问题,我该如何解决这个问题?我应该从哪里开始寻找?任何可以帮助我指明正确方向的链接都会非常有用!

error
----

WFLYEJB0443: EJB 3.1 FR 13.3.3: BMT bean SqlSearchExecutionSessionBean should complete transaction before returning.

然而,正如我之前所说,这是一个一般性错误,当我拼错表名或字段名时,我有时也会遇到此错误!

【问题讨论】:

  • 1.这是什么错误?您如何处理这些查询?如果您在进一步的查询中使用相同的名称,这将失败 2. 您的表名有问题吗?在 Postgres 中,默认情况下每个名称都使用非大写字母。
  • 这是一个很好的例子,说明为什么在生产代码中应该避免使用select *
  • 你的权利@S-Man 这是我对表名的拼写错误。错误是一般错误,通常与错误无关。但供您参考,它的 WFLYEJB0443: EJB 3.1 FR 13.3.3: BMT bean SqlSearchExecutionSessionBean 应该在返回之前完成事务。
  • @a_horse_with_no_name 数据库非常庞大和复杂,没有 erd 映射。所以每当我从一个我不知道的表中检索数据时,我通常会选择 * 并加入一些表以查看相应的值!如果没有选择,我的所有工作都会大大减慢!
  • 这就像你在一个房子里有 2 个孩子,他们都同名 Tito,现在打电话给Tito 谁应该回复?或者如果你打电话给家里不存在的人会回复?同样的方式编码语言不理解这些情况并在你尝试在同一个房子里使用多个相同的名字或打电话给不存在的人时抛出错误。

标签: java postgresql ejb wildfly


【解决方案1】:

因此,您的查询结果不能具有相同的列名。 所以列名id 在你的 SELECT 语句中只能存在一次。

所以我会试试这个:

select s.id, s.classid, c.name, s.version, cs.classname, cs.version
from Students s
join ClassStudent cs on cs.id = s.classid

在这里您不必提及cs.id,因为它始终等于s.id,就像在您的join 语句中一样。但是,如果您确实希望在查询中使用它,您可以给它一个别名,如 cs.id AS csid(或其他一些未使用的名称)并将其添加到您的 SELECT 语句中。

【讨论】:

  • 同名列对于查询来说不是问题。 dbfiddle.uk/…如果你尝试引用它们会是一个问题。
【解决方案2】:

如果您在不同表中的同一字段出现错误,我强烈建议您尝试以这种方式放置它们,而不是为表指定别名:

select Students.id,ClassStudent.id
from Students
join ClassStudent on ClassStudent.id = Student.classid

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    相关资源
    最近更新 更多