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
相关产品推荐
相关产品推荐

