2015-07-20 63 views
2

我創建了一個條件來獲取具有特定角色(候選角色)的用戶並使用其用戶名屬性。下面是我使用的標準:基於用戶角色和屬性的標準

def userRoleList = UserRole.createCriteria().list(max: params.max,offset: params.offset){ 
     createAlias("user","u") 
     addToCriteria(Restrictions.ilike("u.username",name,MatchMode.ANYWHERE)) 
     eq("role",Role.findByAuthority("ROLE_CANDIDATE")) 
     if(userType==1){ 
      addToCriteria(Restrictions.eq("u.deleted",1)) 
     }else if(userType==2){ 
      addToCriteria(Restrictions.eq("u.deleted",0)) 
     } 
    } 

    def userList = userRoleList*.user 

我收到錯誤Unknown column 'u1_.username' in 'where clause'錯誤

+0

我相信'ilike'是區分大小寫的 - 可以嗎? – nuno

+0

哪個版本的Grails? –

+0

@AseemBansal 2.3.8 –

回答

1

要調用上Restrictions返回未在任何地方使用的表達情況的靜態方法。

調用實例方法(省略Restrictions.),以便它們在構建的Criteria中生效。

+0

我試過createAlias(「user」,「u」); ilike(「u.username」,name);但它在createCriteria()行中提供了NPE。我也試過addToCriteria(Restric ..),但它也不起作用。 –

+0

傳入'name' null? –

+0

不,它可以是空白(「」)或包含一些值。 –

1

我不認爲你需要爲此創建別名或此類。您還可以進一步使用標準生成器DSL來指定限制。例如,

def userList = UserRole.createCriteria().list(max: params.max,offset: params.offset){ 
    eq("role",Role.findByAuthority("ROLE_CANDIDATE")) 
    user { 
    ilike('username','%' + name + '%') 
    if (userType == 1){ 
     eq("deleted", 1) 
    } else if(userType == 2){ 
     eq("deleted", 0) 
    } 
    } 
}*.user 

上面似乎犧牲品要麼Grails的或休眠的錯誤/特徵導致失敗如果有問題的表使用複合鍵..如UserRole的(從SpringSecurity插頭)一樣。

一種替代方法是使用HQL - 上述可寫作

def userList = UserRole.executeQuery("select user from UserRole " + 
      "where role_id = ? " + 
      "and lower(username) like ? " + 
      "and deleted = ?",[Role.findByAuthority("ROLE_CANDIDATE")?.id, 
           "%" + name.toLowerCase() + "%", 
           userType == 1 ? 1 : 0]) 

的第一個參數的executeQuery相當於是查詢語句,第二個參數是包含參數在使用地圖查詢。

+0

獲取MissingMethodException。沒有方法的簽名:com.assesmart.user.User.call()適用於「user {」行中的參數類型:(com.assesmart.user.UserController $ _index_closure1_closure11)。 –

+0

我已經使用HQL解決了它。不管怎麼說,還是要謝謝你! +1 –