2014-10-17 30 views
0

所以...有沒有辦法做這樣的事情?Grails Gorm在命名查詢中引用屬性的(列的)值?

class Kitty { 
    String name 
    String nickName 
    public static String getExpectedNickname(String name) { 
     return name.replaceAll('Mr. ', '') 
    } 
    static namedQueries = { 
     byKityWithPredictableNickname { 
      ilike 'name', '%Kitty%' 
      ilike 'nickName', Kitty.getExpectedNickname('name') 
     } 
    } 
} 

我可以以某種方式引用當前行的列值的值嗎?我認爲財產('名稱')會起作用,但唉,不。

編輯:

又如:我覺得像這樣的工作...但它不會:(...

static namedQueries = { 
    whyDoesntThisReturnEverything { 
     int c = Kitty.bySubQuery(id).count() //returns everything when I put "1" instead of "id" 
     c == 1 
    } 
    bySubQuery { Long paramId -> 
     eq 'id', paramId 
    } 
} 

相反,我得到一些愚蠢的非法參數異常:

[email protected] Stacktrace follows: 
Message: [email protected] 
    Line | Method 
->> -1 | invoke        in sun.reflect.GeneratedMethodAccessor327 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|  43 | invoke        in sun.reflect.DelegatingMethodAccessorImpl 
| 606 | invoke . . . . . . . . . . . . . . . in java.lang.reflect.Method 
| 1254 | jlrMethodInvoke      in org.springsource.loaded.ri.ReflectiveInterceptor 
|  90 | invoke . . . . . . . . . . . . . . . in org.codehaus.groovy.reflection.CachedMethod 
|  57 | getProperty       in groovy.lang.MetaBeanProperty 
... 

回答

0

我認爲要做到這一點的唯一方法是通過sqlRestriction

//... 
static namedQueries = { 
    findAllKitty { 
     ilike 'name', '%Kitty%' 
    } 

    findAllByNickNameLikeName { 
     sqlRestriction "nick_name like '%' || replace(name, 'Mr. ', '') || '%' " 
    } 
} 

//to use: 
Kitty.findAllByNickNameLikeName().list() 

SQL語法可能會根據您使用的數據庫而改變。

+0

我不確定我關注...爲什麼你有一切('%')或ed兩次?並不會取代返回一個字符串不是布爾值?我用另一個我希望能夠工作的事例來編輯我的原始問題。 – SnoopDougg 2014-10-20 18:22:51

+0

根據你的例子,你需要所有'''nickname ilike name( - 'Mr.')'''的對象,這就是namedQuery'''findAllByNickNameLikeName''的作用。我只是把''''%''''作爲例子,但是下面也會工作:'''sqlRestriction「nick_name like replace(name,'Mr.','')」'''' – Victor 2014-10-20 18:39:51