Spring Boot JPA中的自定义查询问题

Posted

技术标签:

【中文标题】Spring Boot JPA中的自定义查询问题【英文标题】:Problem with custom Query in Spring 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;

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

【问题讨论】:

【参考方案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(...) 中调用另一个函数”,所以我不知道如何编写这个查询。跨度>

以上是关于Spring Boot JPA中的自定义查询问题的主要内容,如果未能解决你的问题,请参考以下文章

JPQL 的 Spring Boot JPA“查询验证失败”错误

用于在 Spring Data Jpa 中从多个表中获取数据的自定义查询

Spring Data JPA - 带有“@Param Date”的自定义@Query 不起作用

带有 Java/Spring Boot 的 GraphQL 无法从传递的查询中选择定义为在模式中的字段上定义的自定义指令

Spring Boot Jpa框架自定义查询语句返回自定义实体

spring boot 对数据库的自定义查询