Grails:String(用户名)作为主键,但使用ignorecase保存并获取id字符串(用户名)?

时间:2009-11-12 15:04:04

标签: grails groovy primary-key unique username

我使用字符串“username”作为表的主键,

但是当保存并获取具有用户名id的列时,我希望忽略该案例,以便新用户不能尝试模仿其他用户。

例如注册新用户时

  • username = Daxon
  • username = DaXoN //不允许这样做

获取唯一用户名时,可以在任何情况下键入,仍然可以获得。 Youtube用他们的用户名做这个。

e.g。

  • youtube.com/user/Daxon
  • youtube.com/user/DaXoN //无论如何都应该转到'Daxon'的相同个人资料

域类 这使用用户名作为主键

class User {
  String username
  String password

  static constraints = {
  }

  static mapping = {
    id generator: 'assigned', name: "username", type: 'string'
  }
}

然后我支持控制器和视图, 所以有人可以帮我保存和获取案例被忽略的唯一用户名吗?

2 个答案:

答案 0 :(得分:1)

您可以修改生成的控制器的save和get方法来进行字符串比较。在插入用户名之前,您可以执行HQL查询,该查询对要插入的用户名执行不区分大小写的比较,以确保不存在用户名。请参阅以下链接的“HQL和区分大小写”部分。 http://dev.wavemaker.com/wiki/bin/view/Dev/HqlTutorial#HCaseInsensitiveQuery

答案 1 :(得分:1)

您可以阻止第二个用户注册仅在大小写不同的名称的一种方法是在数据库层的用户名上创建不区分大小写的唯一索引。如果您尝试保存与现有名称不区分大小写的名称,则会收到数据库异常。这是mysql的默认设置,但对于其他数据库,类似下面的内容应该这样做:

create unique index username_csunique_idx on user(lower(username));

我不知道在域类DSL中指定那种索引的方法。

要查找对象,请按用户名不区分地查询。例如,User.findByUsernameIlike(userName)User.find("from User as u where lower(u.username) = ?", [userName.toLowerCase()]),如果您更喜欢HQL。