2014-09-19 37 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

相關問題