JPQL limit query [dupliquer]

cette question a déjà une réponse ici:

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""

22
demandé sur Kevin Bowersox 2013-12-19 14:32:54

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();
29
répondu Kevin Bowersox 2014-10-29 10:11:14

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 .

20
répondu George Siggouroglou 2018-05-23 15:06:32

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.

2
répondu muttonUp 2016-09-21 17:31:05

lors de l'exécution de la requête avec le gestionnaire d'entité il suffit d'écrire .setMaxResults(pas d'obj)

0
répondu Udit Agarwal 2014-11-10 12:51:43