Проблема с пользовательским Query in Spring при загрузке JPA - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь подсчитать количество записей по диапазонам, но я получаю сообщение об ошибке при запуске службы:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: expecting CLOSE, found '<' near line 1, column 58 [SELECT new net.BBB.ProjectB.entity.AgeCount(COUNT(s.edad < 15 OR NULL), COUNT(s.edad < 25 AND s.edad > 16 OR NULL), COUNT(s.edad < 35 AND s.edad > 26 OR NULL), COUNT(s.edad < 45 AND s.edad > 36 OR NULL), COUNT(s.edad > 46 OR NULL),FROM net.BBB.ProjectB.entity.Student AS s) ]

Когда я выполняю запрос в базе данных, он работает отлично , Код моего репозитория:

package net.BBB.ProjectB.repository;

import java.util.List;

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import net.BBB.ProjectB.entity.AgeCount;
import net.BBB.ProjectB.entity.NacionalityCount;
import net.BBB.ProjectB.entity.Student;

@Repository
public interface StudentRepository extends CrudRepository<Student, Long> {

    List<Student> findByNombre(String nombre);

    @Query(value = "SELECT new net.BBB.ProjectB.entity.NacionalityCount(COUNT(s.nacionalidad), s.nacionalidad) "
            + "FROM Student AS s GROUP BY s.nacionalidad")
    List<NacionalityCount> countByNacionalidad();

    @Query(value = "SELECT new net.BBB.ProjectB.entity.AgeCount(COUNT(s.edad < 15 OR NULL), "
            + "COUNT(s.edad < 25 AND s.edad > 16 OR NULL), COUNT(s.edad < 35 AND s.edad > 26 OR NULL), "
            + "COUNT(s.edad < 45 AND s.edad > 36 OR NULL), COUNT(s.edad > 46 OR NULL),"
            + "FROM Student AS s) ")
    List<AgeCount> countByAge();

}

Первый запрос работает нормально, второй - проблема. На всякий случай, имя объекта - Student, и у него есть атрибут edad, который я пытаюсь посчитать по диапазонам. Я пытался с другими запросами, которые работают с базой данных, например:

SELECT COUNT(s.edad BETWEEN 0 AND 16 OR NULL), 
        COUNT(s.edad BETWEEN 17 AND 25 OR NULL), 
        COUNT(s.edad BETWEEN 26 AND 35 OR NULL),
        COUNT(s.edad BETWEEN 35 AND 45 OR NULL)
FROM students AS s;

Очевидно, с именем объекта. Я понятия не имею, есть ли способ заставить это работать.

1 Ответ

0 голосов
/ 24 марта 2020

Не совсем уверен, но в вашем HQL-запросе у вас есть "," в конце плюс ")", который должен быть где-то еще?

  + "COUNT(s.edad < 45 AND s.edad > 36 OR NULL), COUNT(s.edad > 46 OR NULL),"
            + "FROM Student AS s) ")

В общем, я бы попытался исправить этот запрос шаг за шагом. Т.е. замените все значения числом c, затем замените 1 счет действительным выражением, после того, как это сработает, замените следующее число c.

...