1

我总是被教导在我的代码中使用 ID 来引用数据库中的记录。

但是让我们假设我们在表 Role 中具有相同的角色。现在我只想查询与角色 Player 相关的记录:

ID    ROLE
1     Admin
2     Organizer
3     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吗?或任何其他方式来改进此代码?

4

4 回答 4

1

在这种情况下,角色似乎应该是一个枚举,您的查询看起来像:

queryObject.setParameter(0, Role.PLAYER);

此外,您可能会查看条件 API,它将帮助您创建更多类型安全的查询,这些查询与重构相比更健壮。

于 2013-09-18T13:20:23.120 回答
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 = ?
于 2013-09-18T13:22:22.473 回答
0

你应该创建一个这样的enum类。

公共枚举角色{

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();
于 2013-09-18T13:23:29.527 回答
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();
于 2013-09-18T13:33:53.437 回答