如何在没有实体管理器的情况下使用 JPA setMaxResults() (LIMIT 20)?

How to Use JPA setMaxResults() (LIMIT 20) Without Entity Manager?

我目前有以下 JPA 设置:

com.example.entities.Employee
com.example.repository.EmployeeRepository
com.example.controllers.EmployeeController

应用程序设置指向 SQL 服务器并且控制器具有没有问题的端点(即“/getEmployees”)。

但是,我想限制返回的员工人数。

使用 JPA 后,我没有使用许多教程建议的任何 entityManager 代码

相反,我在存储库中使用以下设计模式:

com.example.repository.EmployeeRepository

package com.example.repository;

import java.util.List;

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

import com.example.entities.Employee;

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {

    @Query("SELECT "
        + "e.eid, "
        + "e.firstname, "
        + "e.lastname, "
        + "e.dept) "
        + "FROM Employee e")
    public List<Employee> getAllEmployees();

}

下面是端点控制器文件的副本:

com.example.controllers.EmployeeController

package com.example.controllers;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.example.entities.Employee;
import com.example.repository.EmployeeRepository;

@Controller
public class EmployeeController {

    @Autowired
    EmployeeRepository empRepo;

    @RequestMapping(name = "/getAllEmployees")
    public @ResponseBody List<Employee> getAllEmployees() {
        return empRepo.getAllEmployees();
    }

}

如您所见,这些文件中没有提及 entityManager,因此它变得更加抽象,我不确定在哪里启动setMaxResults(20) 方法,未明确使用 entityManager.

我注意到 setMaxResults 函数通常附加到查询对象:

q.setMaxResults(n)

有什么想法吗?

HQL 不支持 LIMIT 功能,所以这里有 2 个选项:

  • 使用本机 SQL 查询
  • 使用 entityManager 和 setMaxResults

如何在 Spring 数据中使用 Pageable 接口?

package com.example.repository;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable

import com.example.entities.Employee;

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {

    @Query("SELECT "
        + "e.eid, "
        + "e.firstname, "
        + "e.lastname, "
        + "e.dept) "
        + "FROM Employee e")
    public Page<Employee> getAllEmployees(Pageable pageable);

}

在您的控制器中,您可以设置您想要获得的物品数量:

@RequestMapping(name = "/getAllEmployees")
public @ResponseBody List<Employee> getAllEmployees() {
    return empRepo.getAllEmployees(new PageRequest(0, 20)).getContent();
}