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
Vous devez vous connecter pour publier un commentaire.
Code ci-dessous devrait le faire. J'utilise dans mon propre projet et testé pour la plupart des cas.
utilisation:
et le code source:
c'est Apache bibliothèque commune pour la comparaison de l'égalité des champs. Vous pouvez simplement comparer chaque champs un par un. Consultez cet article pour plus de détails mkyong.com/java/java-how-to-overrides-equals-and-hashcode
Pour
hasPrevious()
, ne devrait-elle pas êtrereturn offset >= limit;
?Ce serait une bonne idée d'inclure ce ou quelque chose de similaire directement dans le cadre...
OriginalL'auteur codingmonkey
Vous pouvez le faire en créant votre propre Paginable.
Essayer cet échantillon de base. Fonctionne très bien pour moi:
OriginalL'auteur Tobias Michelchen
Peut-être que la réponse est à peu de retard, mais j'ai pensé à la même chose. Calculer le courant de page basée sur le décalage et la limite. Eh bien, ce n'est pas exactement la même parce qu'il "suppose" que l'offset est un multiple de la limite, mais peut-être que votre application est adapté pour cela.
Je vous suggère un changement de l'architecture. Changement de votre contrôleur ou tout ce que les appels au service d'abord de vous donner la page et de limiter si possible.
OriginalL'auteur Sebastian
Vous ne pouvez pas faire cela avec spring data jpa. Si le décalage est très petite, vous pouvez juste enlever le haut X consolidés à partir de la requête après la récupération.
Sinon, vous pouvez définir la taille de la page à l'offset et de commencer à la page+1.
OriginalL'auteur membersound
Ici, vous allez:
OriginalL'auteur supercobra