Я использую JPA CriteriaBuilder и список для запроса таблицы пользователя. Мне нужно использовать побитовый оператор & в CriteriaBuilder. Мой пример базы кода выглядит следующим образом.
Структура таблицы пользователя выглядит следующим образом.
create TABLE `tbl_user` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`login_id` VARCHAR(255) NOT NULL,
`name` VARCHAR(255) NOT NULL,
`email` VARCHAR(500) NOT NULL,
`role_value` INTEGER,
`password` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
);
Здесь role_value
- это поле, в котором мы указываем побитовые значения ИЛИ, чтобы сохранить роль пользователя.
Роли указаны со значениями ниже битов
public enum Role {
ROLE_POLICE(1, "POLICE"),
ROLE_BRIDGE(2, "BRIDGE"),
ROLE_SECURITY(4, "SECURITY"),
ROLE_ASSISTANT_USER(8, "ASSISTANT_USER"),
ROLE_HARDWARE_USER(16, "HARDWARE_USER"),
;
private final String roleValue;
private final Integer id;
Role(Integer id, String roleValue, Role... secondaryRoles) {
this.id = id;
this.roleValue = roleValue;
this.secondaryRoles = secondaryRoles;
}
}
Я хотел бы запросить список пользователей, используя CriteriaBuilder, где мне нужно отфильтровать пользователей с определенными значениями roleValues, используя выражения "Predicate" и JPA "Выражения" .
Мой код выглядит следующим образом.
@Override
public Page<UserView> listUsers(UserListRequest userListRequest) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<User> listCriteria = cb.createQuery(User.class);
Root<User> userRoot = listCriteria.from(User.class);
if (!userListRequest.getUserIds().isEmpty()) {
wherePredicates.add(cb.in(userRoot.get("id")).value(userListRequest.getUserIds()));
}
/* this portion is having syntax error */
if (null != userListRequest.getRoleValue()) {
wherePredicates.add(cb.equal(userRoot.get("role_value"), (userRoot.get("role_value") & userListRequest.getRoleValue()));
}
.
.
.
return getPageFromTypedQuery(cb, userRoot, listCriteria, wherePredicates, userListRequest, UserView.class);
}