Как вернуть значение Long (тип данных) из кеша Redis

Я сохраняю userId как Long в кеше Redis в моем весеннем загрузочном приложении, но при его извлечении он возвращает тип Integer и выдает исключение

java.lang.Integer cannot be cast to java.lang.Long

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

@Cacheable(value = CacheConstants.GAUTH_CACHE, key = "#root.target.PASSWORD_SALT.concat(#loginTxt.toString())", unless = "#result == null")
    public Long getPasswordSaltFromLoginText(String loginTxt) {
        Long userId = null;
        if (StringUtils.isNotBlank(loginTxt)) {
            userId =  profileRepository.getUserIdForPasswordSalt(loginTxt, "PasswordSalt");
        }
        return userId;
    }

Мой запрос Hibernate примерно такой. в котором A.USR_ID является типом Long

@Query(nativeQuery = true, value = "select A.USR_ID from user_tbl A, another_table B WHERE A.USR_ID = B.USR_ID AND "
            + " UPPER(A.loginTxt) = UPPER(:loginTxt) "
            + " AND B.prefName=:prefName ")

    Long getUserId(@Param("loginTxt") String loginTxt, @Param("prefName") String prefName);

Класс сущности

@Entity
@Table(name = "Table1", schema = "Schema_name")
public class Profile {

    @Id
    @Column(name = "USR_Id")
    public Long USR_ID;

    @Column(name = "other_column")
    public Long other_column;

    @Column(name = "other_column2")
    public Long other_column2;

}

Вы уверены, что сохраняете его как Long?

Thomas 30.04.2019 10:11

Да, вы можете увидеть код, в котором идентификатор пользователя хранится как Long

Sumit Sood 30.04.2019 10:16

Каков точный тип базы данных A.USR_ID?

Thomas 30.04.2019 11:52

В базе данных A.USR_ID тип данных NUMBER

Sumit Sood 30.04.2019 12:11

Ну, этот мощь на самом деле сопоставляется с Integer внутренне (и таким образом может быть помещен в кеш). Какую базу данных вы используете?

Thomas 30.04.2019 12:13

Я думаю, вы правы. Я использую базу данных Oracle. Есть ли способ сделать это в JPA или в nativequery, чтобы он мог возвращать Long?

Sumit Sood 30.04.2019 12:18

Что ж, использование JPA, отображающее его на Long, и загрузка данных через объекты должны работать.

Thomas 30.04.2019 12:41

не могли бы вы привести небольшой пример? это было бы большим подспорьем.

Sumit Sood 30.04.2019 12:50

Разве вы еще не сопоставили свои данные с объектами JPA? Если нет, я бы предложил взять учебник по этому вопросу - в этом случае небольшого примера может быть недостаточно.

Thomas 30.04.2019 15:01

Я уже сделал это, но это не сработало. Я собираюсь добавить сюда свой класс сущности.

Sumit Sood 30.04.2019 15:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
10
1 386
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кэш Redis не поддерживает тип данных Long. Итак, я сохранил весь объект профиля в кэше Redis и, используя getter(), смог получить значение Long.

@Query(nativeQuery = true, value = "select A.USR_ID,A.other_column,A.other_column2 from user_tbl A, another_table B WHERE A.USR_ID = B.USR_ID AND "
            + " UPPER(A.loginTxt) = UPPER(:loginTxt) "
            + " AND B.prefName=:prefName ")

    Profile getUserId(@Param("loginTxt") String loginTxt, @Param("prefName") String prefName);

Другие вопросы по теме