Grails Hibernate:强制get()遵守其参数的数据类型

Grails Hibernate:强制get()遵守其参数的数据类型,grails,gorm,Grails,Gorm,设置:Grails2.5.6和Hibernate4.3.10 我有一个带有字符串id的表。事实是,它的值是数字字符串,当我传入一个值(如“000000”)时,这似乎会弄乱get() 域类: class Term { static mapping = { id name: 'code', generator: 'assigned' version false code column: 'CODE' description column: 'DESC' }

设置:Grails2.5.6和Hibernate4.3.10

我有一个带有字符串id的表。事实是,它的值是数字字符串,当我传入一个值(如
“000000”
)时,这似乎会弄乱
get()

域类:

class Term
{
  static mapping = {
    id name: 'code', generator: 'assigned'
    version false
    code column: 'CODE'
    description column: 'DESC'
  }

  String code
  String description
}
数据如下所示:

CODE   || DESC
-------++---------------------------
000000 || The Beginning of Time
201715 || Post Secondary Winter 2017
201815 || Post Secondary Winter 2018
999999 || The End of Time
然后在测试中我发现了以下几点:

assert Term.list()          // works fine
assert !Term.get('foo')     // works fine
//assert Term.get('000000') // throws exception
引发的异常是:

Method threw 'org.springframework.orm.hibernate4.HibernateSystemException' exception.
Provided id of the wrong type for class Term. Expected: class java.lang.String, got class java.lang.Long
org.hibernate.TypeMismatchException: Provided id of the wrong type for class Term. Expected: class java.lang.String, got class java.lang.Long

因此,从某个角度看,“000000”和“201715”以及其他任何不方便转换为长对象的东西。将
用作字符串也没有帮助。有人能帮我告诉Hibernate这个字符串应该被当作一个字符串吗?

这看起来像是Grails的错误,我猜这是因为您没有在域类中将
id
声明为
String
类型,因为它被映射到不同的字段(这是有意义的)

您可以尝试添加

String id
到您的域类,尽管这可能不会导致列生成的预期行为


我建议不要使用
get()
您可以使用
findByCode()
,因为您已将id映射到
code
字段,结果应该是相同的。

是的,
findByCode()
工作正常,但我认为添加
字符串id
是正确的解决方法。这很难看,但是现在
get()
工作正常了。啊,很高兴它起作用了。我想它可能会尝试创建/使用一个名为“id”的列,尽管映射没有尝试让它创建表;它还可能创建
id
列。但事实上,它并没有寻找专栏,这表明它可能足够聪明,不这样做。我正在使用现有的表,否则我将使用标准的
id
version
。不管怎样,谢谢你的帮助,彼得!