Как использовать побитовые операторы в JPA CriteriaBuilder - PullRequest
0 голосов
/ 30 марта 2020

Я использую 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...