web-dev-qa-db-fra.com

Requête limite JPQL

Comment limiter une requête de requête nommée JPQL? J'ai besoin que la limite soit définie au niveau de la requête elle-même et non dans la couche Java !!!

@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!!!

Veuillez suggérer 

29
user3115056

JPQL ne fournit pas de mécanisme pour limiter les requêtes. Ceci est le plus souvent réalisé en utilisant la méthode setMaxResults() sur la Query. Si vous devez éviter de spécifier cela dans le code Java, vous pouvez créer une vue dans la base de données contenant votre requête et exécutant la limite. Mappez ensuite une entité sur cette vue comme vous le feriez avec une table.

Exemple:

List<String> resultList= query.setMaxResults(100).getResultList();
32
Kevin Bowersox

Si vous travaillez avec spring-data , utilisez l’interface Pageable Interface . Un exemple de code ci-dessous,

Mon service, 

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 trouverez une réponse plus complète sur les options de données de printemps disponibles ici .

23

Pour les @NamedQueries spécifiques où une limite est requise, vous pouvez passer à @NamedNativeQuery.

@NamedNativeQuery(
  name=UserNotification.QueryName.NOTIFICATION_DISPLAYED_LIMIT5,
  query="SELECT un.* FROM user_notification un " + 
        "WHERE un.user.id = ?1 LIMIT 5",
  resultClass=UserNotification.class
)

Pas aussi lisse, mais fait le travail.

5
muttonUp

lors de l'exécution de la requête avec le gestionnaire d'entités, écrivez simplement .setMaxResults (no of obj)

0
Udit Agarwal