2014-09-19 61 views
2

这个问题涉及a question I had yesterday异常。他们听起来像不同的问题,但我只是想出了我认为的核心问题。我不确定重做最后一个问题是否是这里最好的行动方案,所以我只是发布了一个单独的问题。使用非主键UUID类型字段findBy *方法导致

那么,回到问题。我有以下域类:

class Person { 

    static constraints = { 
     key unique: true 
    } 

    static mapping = { 
     key sqlType: 'binary(16)' 
    } 

    UUID key 

} 

每当我试着打电话findByUserId,我得到以下异常:

org.springframework.dao.InvalidDataAccessResourceUsageException: Cannot query [sample.Person] on non-existent property: key 

所以,事实证明,我有我所描述的问题的原因在较老的问题中,声明财产独特意味着在验证过程中,GORM方法被调用。我通过尝试实现一个类似的自定义验证器来发现这一点。

现在我的问题是,为什么会发生这种情况,我能做些什么呢?

当我使用UUID类型标识属性(id)时,我没有遇到任何问题,GORM方法get(id)或甚至findById(id)。例如,如果我有以下域类:

class Person { 

    static mapping = { 
     id generator: 'assigned', sqlType: 'binary(16)' 
    } 

    UUID id 

    Person() { 
     id = UUID.randomUUID() 
    } 

} 

下面的测试工作得很好:

given: 
Person person = new Person() 
person.save() 

expect: 
Person.get(person.id) 
Person.findById(person.id) 
+1

我会尝试查看正在执行的SQL。我猜hibernate没有正确处理UUID对象到二进制列的映射。您可以在'DataSource.groovy'中添加'logSql = true'来打开日志记录。 – MattZ 2014-09-19 21:07:05

+0

我不确定UUID到二进制列的映射,因为如果该字段是id,它工作正常。我已经更新了这个问题。 – 2014-09-20 08:21:22

回答

0

您可能需要设置type(的代替或者除了sqlType) 。例如,对于PostgreSQL,它是:

static mapping = { 
    id generator: 'assigned', type: 'pg-uuid' 
} 
+0

“pg-uuid”供应商特定(我从“pg”部分获得印象)? – 2016-01-26 08:08:05

+0

是的,对不起 - 我会编辑我的回复。在这种情况下,它将用于PostgreSQL。 – Igor 2016-01-26 16:46:57