Я сохраняю 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
Каков точный тип базы данных A.USR_ID?
В базе данных A.USR_ID тип данных NUMBER
Ну, этот мощь на самом деле сопоставляется с Integer внутренне (и таким образом может быть помещен в кеш). Какую базу данных вы используете?
Я думаю, вы правы. Я использую базу данных Oracle. Есть ли способ сделать это в JPA или в nativequery, чтобы он мог возвращать Long?
Что ж, использование JPA, отображающее его на Long, и загрузка данных через объекты должны работать.
не могли бы вы привести небольшой пример? это было бы большим подспорьем.
Разве вы еще не сопоставили свои данные с объектами JPA? Если нет, я бы предложил взять учебник по этому вопросу - в этом случае небольшого примера может быть недостаточно.
Я уже сделал это, но это не сработало. Я собираюсь добавить сюда свой класс сущности.




Кэш 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);
Вы уверены, что сохраняете его как
Long?