La Pagination dans Spring Data JPA (limit et offset)

Je veux que l'utilisateur puisse spécifier la limite de la taille de la valeur retournée) et l'offset (le premier enregistrement retourné /index retourné dans ma méthode de requête.

Voici mes classes, sans pagination capacités.
Mon entité:

@Entity
public Employee {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    @Column(name="NAME")
    private String name;

    //getters and setters
}

Mon référentiel:

public interface EmployeeRepository extends JpaRepository<Employee, Integer> {

    @Query("SELECT e FROM Employee e WHERE e.name LIKE :name ORDER BY e.id")
    public List<Employee> findByName(@Param("name") String name);
}

Mon interface de service:

public interface EmployeeService {

    public List<Employee> findByName(String name);
}

Mon service de mise en œuvre:

public class EmployeeServiceImpl {

    @Resource
    EmployeeRepository repository;

    @Override
    public List<Employee> findByName(String name) {
        return repository.findByName(name);
    }
}

Maintenant ici est une tentative de ma part lors de la fourniture de la pagination des capacités de charge offset et la limite.
Ma classe d'entité reste le même.

Mon "nouveau" référentiel prend en paginable paramètre:

public interface EmployeeRepository extends JpaRepository<Employee, Integer> {

    @Query("SELECT e FROM Employee e WHERE e.name LIKE :name ORDER BY e.id")
    public List<Employee> findByName(@Param("name") String name, Pageable pageable);
}

Ma "nouvelle" interface de service prend deux paramètres supplémentaires:

public interface EmployeeService {

    public List<Employee> findByName(String name, int offset, int limit);
}

Mon "nouveau" service de la mise en œuvre:

public class EmployeeServiceImpl {

    @Resource
    EmployeeRepository repository;

    @Override
    public List<Employee> findByName(String name, int offset, int limit) {
        return repository.findByName(name, new PageRequest(offset, limit);
    }
}

Ce n'est cependant pas ce que je veux. PageRequest spécifie la page et la taille (numéro de page et la taille de la page). Maintenant, en spécifiant la taille est exactement ce que je veux, cependant, je ne veux pas de spécifier la page de départ #, je veux que l'utilisateur puisse spécifier l'enregistrement de début /d'index. Je veux quelque chose de semblable à

public List<Employee> findByName(String name, int offset, int limit) {
    TypedQuery<Employee> query = entityManager.createQuery("SELECT e FROM Employee e WHERE e.name LIKE :name ORDER BY e.id", Employee.class);
    query.setFirstResult(offset);
    query.setMaxResults(limit);
    return query.getResultList();
}

Spécifiquement la setFirstResult() et setMaxResult() méthodes. Mais je ne peux pas utiliser cette méthode parce que je veux utiliser l'Employé référentiel de l'interface. (Ou est-il réellement meilleur pour définir des requêtes par le biais de l'entityManager?) De toute façon, il est un moyen pour spécifier le décalage sans l'aide de l'entityManager? Merci à l'avance!

OriginalL'auteur chinesewhiteboi | 2014-07-29