Grails Hibernate:强制get()遵守其参数的数据类型
设置:Grails2.5.6和Hibernate4.3.10 我有一个带有字符串id的表。事实是,它的值是数字字符串,当我传入一个值(如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' }
“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
。不管怎样,谢谢你的帮助,彼得!