如何在 Spring Data JPA 中使用 JPA @Query 和本机 SQL 查询来获取随机结果?

问题描述 投票:0回答:1

我正在使用 Spring Data JPA 开发 Spring Boot 应用程序,并且我正在尝试创建一个存储库方法,该方法根据指定类别从问题表中检索随机问题列表。我尝试使用 @Query 注释来实现此目的,但遇到错误。

这是代码:

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(String category, int numQ);
}

错误: MySQL:输入“SELECT * FROM Question q WHERE q.category = :category ORDER BY RAND() LIMIT :”没有可行的替代方案

我尝试过的: 我使用 ORDER BY RANDOM() 但为了 MySQL 兼容性而改用 ORDER BY RAND()。

我期待什么: 一种有效的 JPA 存储库方法,可根据给定类别从问题表中检索指定数量的随机问题。

mysql spring-boot spring-data-jpa
1个回答
0
投票

您无法像您所做的那样将占位符绑定到

LIMIT
子句。 您可以做的是提供
findRandomQuestionsByCategory()
方法的实现,并使用JPA存储库方法来强制限制结果集的大小。

@Override
public List<Passenger> findRandomQuestionsByCategory(String category, int limit) {
    String sql = "SELECT q.id FROM question q WHERE q.category = :category ORDER BY RAND()";
    return entityManager.createQuery(sql, Integer.class)
                        .setMaxResults(limit)
                        .getResultList();
}
© www.soinside.com 2019 - 2024. All rights reserved.