【问题标题】:Problem with custom Query in Spring boot JPASpring Boot JPA中的自定义查询问题
【发布时间】:2020-07-05 02:06:49
【问题描述】:

我正在尝试按范围计算记录数,但在运行服务时出现错误:

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;

显然带有实体的名称。我不知道是否有办法让它发挥作用。

【问题讨论】:

    标签: spring spring-boot spring-mvc spring-data-jpa


    【解决方案1】:

    不完全确定,但在您的 HQL 查询中,您在末尾有一个“,”加上一个“)”,它应该在其他地方吗?

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

    一般来说,我会尝试逐步修复此查询。 IE。将所有计数替换为静态数字,然后将 1 个计数替换为实数表达式,一旦可行,替换下一个计数,等等。

    【讨论】:

    • 谢谢,没有注意到,已经更正了,但错误仍然存​​在。我在这里发现了一个类似的问题link,因为它说“查询解析器似乎不支持在 count(...) 中调用另一个函数”,所以我不知道如何编写这个查询。跨度>
    猜你喜欢
    • 2012-09-13
    • 2020-11-12
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    相关资源
    最近更新 更多