You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data JPA中使用@Query执行原生SQL获取指定分类随机问题的实现及报错解决

Spring Data JPA中使用@Query执行原生SQL获取指定分类随机问题的实现及报错解决

看起来你在尝试用原生SQL从指定分类里随机捞几个问题ID,但碰到MySQL相关的报错了对吧?别慌,咱们先从你的代码里找问题,一步步解决。

首先,我注意到你的方法参数String category和int numQ没有加@Param注解——这大概率是你报错的原因!在Spring Data JPA的原生SQL查询里,如果你用了:category、:numQ这种命名参数,就必须给方法参数加上@Param注解来明确和SQL占位符的对应关系,不然Spring没法把参数值正确绑定到SQL里,很可能就会抛出“参数未指定”之类的MySQL错误。

咱们先把代码修正一下,加上@Param注解:

package com.example.dao;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import com.example.model.Question;

@Repository
public interface QuestionDao extends JpaRepository<Question, Integer> {

    List<Question> findByCategory(String category);

    @Query(value = "SELECT q.id FROM question q WHERE q.category = :category ORDER BY RAND() LIMIT :numQ", nativeQuery = true)
    List<Integer> findRandomQuestionsByCategory(@Param("category") String category, @Param("numQ") int numQ);
}

如果你的报错是类似“no value specified for parameter”这类,加了@Param之后应该就能解决了。

另外给你两个小补充:

  • 如果你不想只返回ID,而是要返回完整的Question实体对象,只需要把SQL改成SELECT * FROM question q WHERE q.category = :category ORDER BY RAND() LIMIT :numQ,方法返回值改成List<Question>就行。
  • 要确认你的数据库表名确实是question(全小写),如果你的Question实体类用了@Table(name = "xxx")指定了其他表名,那SQL里的表名要和注解里的一致,不然会报表不存在的错误。

备注:内容来源于stack exchange,提问作者Oppai Zuki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 12:44:33