Извлечение данных из базы данных на карту

#java #spring #spring-boot #hibernate #jpa

#java #весна #весенняя загрузка #спящий режим #jpa

Вопрос:

Я пытаюсь запросить данные на карте :

 @Repository
public interface IUserRepository extends PagingAndSortingRepository<UserEntity, String> {

    @Query("SELECT DISTINCT (u.userId, u) FROM UserEntity u WHERE userId in (:userIds)")
    Map<String, UserEntity> findAllByUserIdIn(@Param("userIds") Collection<String> userIds);
    
 

Но я получаю эту ошибку:

 Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: {vector} [SELECT DISTINCT (u.userId, u) FROM com.telefire.device.server.users.model.UserEntity u WHERE userId in (:userIds)]
...
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: {vector} [SELECT DISTINCT (u.userId, u) FROM com.telefire.device.server.users.model.UserEntity u WHERE userId in (:userIds)]
 

JPA этого не допускает?
Спасибо!

Комментарии:

1. Привет, я думаю, что вы написали неправильный запрос. Может быть, попробуйте это SELECT DISTINCT u.userId, u ИЗ UserEntity u, ГДЕ userId в (:UserIds) . Другой способ — просто использовать findAllByUserIdIn без @Query и извлечь список, затем использовать java stream, чтобы сделать его отображаемым с помощью Collectors.groupingBy.

2. Привет, спасибо, но это не сработало. Я хочу сделать это без потока, но когда я извлекаю данные из БД…

3. Я понимаю, что он не может выполнять distinct для u , что подразумевало бы выполнение distinct для u.* : все поля, которые u может содержать.

4. DISTINCT является функцией одного параметра, поэтому он не может содержать char , . Попробуйте что-то вроде этого : SELECT DISTINCT (u.userId), u FROM UserEntity u WHERE userId in (:userIds) . Я не уверен, что это даст вам правильный результат, как написал @MarcLeBihan в комментариях, но это устранит синтаксическую ошибку, с которой вы столкнулись.

Ответ №1:

Исключение означает неправильный синтаксис запроса.

Пожалуйста, проверьте: http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods .создание запроса

второй вариант добавить NativeQuery = true

     @Query("SELECT DISTINCT (u.userId, u) FROM UserEntity u WHERE userId in (:userIds)",nativeQuery = true)
 

третий вариант добавить значение =:

     @Query(value = "SELECT DISTINCT (u.userId, u) FROM UserEntity u WHERE userId in (:userIds)",nativeQuery = true)