2013-09-18 5 views
1

Меня всегда учили использовать идентификаторы в моем коде, чтобы ссылаться на записи в базу данных.Я не могу использовать идентификатор в своем коде

Но давайте рассмотрим случай, когда у нас есть те же роли в таблице Роль. Теперь я хочу, чтобы запросить только записи, относящиеся к роли игрока:

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(); 

Как вы можете видеть, я написал «плеер» в коде. Я думаю, что это не лучший способ, и я должен использовать идентификатор. Но я не знаю идентификатор, и он может меняться в зависимости от сервера, на котором я запускаю приложение. Вторая проблема с моим решением заключается в том, что «игрок» можно загладить в базу данных, и это может быть изменено с течением времени.

Итак, каково должно быть решение всех этих проблем? Есть ли способ использовать идентификатор? Или любой другой способ улучшить этот код?

+0

Для этого, лучше создать класс перечисления для отображения идентификатора к роли. – vikiiii

ответ

1

В этом случае, кажется, что роль должна быть перечисление и ваш запрос будет выглядеть примерно так:

queryObject.setParameter(0, Role.PLAYER); 

Кроме того, вы можете взглянуть на критерии API, который поможет вам создать более типобезопасный более надежные и рефакторинговые запросы.

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 = ? 
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(); 
0

Что вы вызываете идентификатор не действительно ID, это код в таблица поиска. У объектов есть идентификаторы, это не сущность.

Имея изменение числа глупо, потому что это должно быть проблемой внутренней реализации. Но это обычное табло о кустах на предприятиях ИТ.

Что-то должно быть постоянным, чтобы вы могли получить идентификатор. Если вы не можете рассчитывать на постоянный идентификатор, вам придется искать его по имени или другим атрибутом идентификации. Используйте константы или перечисления, чтобы ссылаться на любой атрибут идентификации, чтобы вы могли минимизировать такие проблемы, как капитализация.

0

с использованием идентификаторов или строки/вакара и т. Д. Поиск зависит от данных, которые у вас есть в базе данных. Некоторые организации сохраняют идентификатор static, а некоторые сохраняют имя/описание static. Поэтому убедитесь, что у вас есть хорошее представление о данных БД и что останется статическим.Однако, если роль статична, вы можете использовать случай игнорирования 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(); 
Смежные вопросы