JPQL limit query [dupliquer]
cette question a déjà une réponse ici:
- nombre limite de résultats en JPQL 2 réponses
Comment puis-je limiter dans une requête select la requête nommée JPQL? J'ai besoin que la limite soit faite dans le niveau de requête lui-même et pas dans la couche java!!! J'essaie d'utiliser
@NamedQueries(value = {
@NamedQuery(name = UserNotification.QueryName.NOTIFICATION_DISPLAYED,
query = "SELECT un FROM UserNotification un " +
"WHERE un.orgId IN (:orgList) " +
"AND un.user.id = :userId LIMIT 5")
mais en vain!!!
please suggest""
4 réponses
JPQL
ne fournit pas de mécanisme pour limiter les requêtes. Cela est le plus souvent obtenu en utilisant la méthode setMaxResults()
sur le Query
. Si vous devez éviter de spécifier cela dans le code Java, vous pouvez faire une vue dans la base de données qui contient votre requête et exécute la limite. Puis mappez une entité à cette vue comme vous le feriez une table.
exemple:
List<String> resultList= query.setMaxResults(100).getResultList();
si vous travaillez avec spring-data vous devez utiliser le Pageable Interface . Un exemple de code ci-dessous,
Mon Service", 151970920"
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
@Service
public class MyModelService {
@Autowired
private MyModelRepository myModelRepository;
@Transactional
public Page<MyModel> findMyModelTop5() {
return myModelRepository.findMyModelTop5(new PageRequest(0, 5));
}
}
Mon Référentiel,
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
@Repository
public interface MyModelRepository extends JpaRepository<MyModel, Integer> {
@Query("SELECT mm FROM MyModel mm")
public Page<MyModel> findMyModelTop5(Pageable pageable);
}
vous pouvez trouver une réponse plus complète sur les données de printemps disponibles options ici .
pour les séries @NamedQueries spécifiques pour lesquelles une limite est requise, vous pouvez passer à @NamedNativeQuery
@NamedNativeQuery(
name=UserNotification.QueryName.NOTIFICATION_DISPLAYED,
query="SELECT un.* FROM user_notification un " +
"WHERE un.user.id = ?1 LIMIT 5",
resultClass=UserNotification.class
)
Pas tout à fait lisse, mais fait le travail.
lors de l'exécution de la requête avec le gestionnaire d'entité il suffit d'écrire .setMaxResults(pas d'obj)