我总是被教导在我的代码中使用ID来将记录引用到数据库中。
但是我们假设我们在表Role中有相同的角色。现在我想只查询与角色Player相关的记录:
ID ROLE
1 Admin
2 Organizer
3 Player
我在我的代码中不知道Player的ID,但是我想要检索所有的玩家,所以用Hibernate我写道:
String queryString = "from User u where u.role.role = ?";
Query queryObject = getSession().createQuery(queryString);
queryObject.setParameter(0, "player");
return queryObject.list();
如你所见,我在代码中写了“播放器”。我认为这不是最好的方式,我应该使用ID。但我不知道ID,它可能会改变,具体取决于我运行应用程序的服务器。我的解决方案的第二个问题是“播放器”可以大写到数据库中,这可能会随着时间的推移而改变。
那么,所有这些问题的解决方案应该是什么?有没有办法使用ID代替?或者其他任何改进此代码的方法?
答案 0 :(得分:1)
在这种情况下,似乎角色应该是枚举,并且您的查询看起来像:
queryObject.setParameter(0, Role.PLAYER);
此外,您可以查看条件API,它可以帮助您创建更强大的类型安全查询,而不是重构。
答案 1 :(得分:0)
您可以使用创建映射表,如
UserRoleMapping
ID - Incremental,
UserId - Refers to user table,
RoleId - Refers to role table
由于一个用户可以拥有多个角色,因此它也会满足这一要求。 使用查询
获取角色select role.id from userrolemapping urm innerjoin on user u.id = urm.id where u.id = ?
答案 2 :(得分:0)
您应该像这样创建一个enum
类。
public enum Role {
Admin(1),
Organizer(2),
Player(3);
}
将代码更改为
String queryString = "from User u where u.id= ?";
Query queryObject = getSession().createQuery(queryString);
queryObject .setParameter(0, Role.PLAYER);
return queryObject.list();
答案 3 :(得分:0)
使用ID或字符串/ vachar等查找完全取决于您在数据库中拥有的数据。某些组织将id保持为静态,有些组织将名称/描述保持为静态。因此,请确保您对数据库数据有充分的了解,并保持静态。但是,如果角色是静态的,您可以使用HQL忽略大小写,如下面我为您提供的示例(我没有添加有关ID静态路径的信息,因为其他人已经提供了有关它的信息,并且不想复制它)。 - 注意如果你只想要“玩家”,你可以拿出百分比
String queryString = "from User u where lower( u.role.role ) like lower('%"+ ? +"%')";
Query queryObject = getSession().createQuery(queryString);
queryObject.setParameter(0, "player");
return queryObject.list();