【问题标题】:Grails naming id column ErrorGrails 命名 id 列错误
【发布时间】:2012-11-21 04:17:22
【问题描述】:

我的域类有问题。每次我尝试插入条目时都会出现此错误:

The column name "Sequence_No" was not found in this ResultSet.

这是我的域类:

class Record {

String firstName
String middleName
String lastName
String motherMaidenLastName
String motherMaidenMiddleName
Date birthDate
String examTypeCode
Date examinationDate

static constraints = {
    firstName nullable:false, blank:false, maxSize: 50
    middleName nullable:true, blank:true, maxSize: 50
    lastName nullable:false, blank:false, maxSize: 50
    motherMaidenLastName nullable:true, blank:true, maxSize: 50
    motherMaidenMiddleName nullable:true, blank:true, maxSize: 50
    birthDate  nullable: false
    examTypeCode  nullable: false, maxSize: 4
    examinationDate  nullable: false
}

static mapping  = {
    datasource 'oevs'
    table '`elig`'
    id column: '`Sequence_No`'
    firstName column: '`FirstName`'
    middleName column: '`MiddleName`'
    lastName column: '`LastName`'
    motherMaidenLastName column: '`MotherMaidenLastName`'
    motherMaidenMiddleName column: '`MotherMaidenMiddleName`'
    birthDate column: '`Date_Birth`'
    examTypeCode column: '`ExamType`'
    examinationDate column: '`Date_Exam`'
    }
}

但是我试图保存的条目被插入到数据库中,它只是抛出了那个错误。我正在使用 PostgreSQL。我被要求以这种方式命名列名。这就是为什么我需要在命名我的列时放置一个反引号字符,因为如果不这样做,PostgreSQL 会自动将其全部转换为小写字母。每次我删除 id 列中的反引号字符时,错误都不会出现,但显然列名已转换为小写。

【问题讨论】:

  • 您在数据源中使用的是 create-drop 还是 update?你检查过数据库架构吗?
  • 是的,我在我的数据源中使用 create-drop。我已经检查了架构。似乎错误是由 id 列中的反引号字符引起的,每次我删除列 id 上的反引号时,一切正常。让我感到困惑的是其他带有反引号字符的属性列不会导致任何错误,这与 id 列不同。

标签: hibernate postgresql grails identifier quoting


【解决方案1】:

错误在于这句话:

这就是为什么我需要在为我的列命名时添加一个反勾号 因为 PostgreSQL 会自动将其全部转换为小写字母 如果不这样做。

反引号 (``) 仅在 MySQL 中使用(毫无意义地违反 SQL 标准 - 您可以使用 SET sql_mode = 'ANSI'; 来解决此问题)。反引号对 PostgreSQL 或标准 SQL 没有特殊意义。在 PostgreSQL 中使用 双引号("")(真的在任何地方)来实现您的目标。更多详情this related answer。

你几乎是对的:没有双引号的标识符在PostgreSQL中被转换为小写。详情请阅读手册中的Identifiers and Key Words章节。

我通常建议不要在 PostgreSQL 中使用 CamelCase 标识符。有很多方法可以克服它。困惑的用户的绝望问题不断出现在这里。如果可以的话,不要使用 CamelCase 和双引号标识符。创建非标准标识符后,您必须始终将其双引号 ...

【讨论】:

  • 我在我的域类中使用 double-quotes("") 对其进行了测试,同样的事情发生了。除了我的 grails 中的 id 列之外,我声明的所有列 带有 backticks(``) 的域类在 CamelCase 中成功命名。我被要求以这种方式命名这些列,也许我应该建议他们像你说的那样以标准方式命名表列,因为我仍然不知道如何在 grails 中解决这个问题。
猜你喜欢
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多