Предельный запрос JPQL

Как я могу ограничить выбор запроса JPQL с именем query? Мне нужно, чтобы предел выполнялся на уровне запроса, а не в слое 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")

но тщетно!!!

Пожалуйста, предложите

Ответы

Ответ 1

JPQL не предоставляет механизм ограничения запросов. Это чаще всего достигается с помощью метода setMaxResults() на Query. Если вы не должны указывать это в Java-коде, вы можете сделать представление в базе данных, содержащей ваш запрос, и выполнить ограничение. Затем сопоставьте сущность с этим представлением, как и таблицу.

Пример:

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

Ответ 2

Если вы работаете с spring-data, вы должны использовать Интерфейс веб-страниц. Пример кода ниже,

Моя служба,

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));
    }
}

Мой репозиторий,

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);

}

Ответ 3

Для конкретных @NamedQueries, где требуется ограничение, вы можете переключиться на @NamedNativeQuery

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

Не так гладко, но выполняет эту работу.

Ответ 4

во время выполнения запроса с менеджером сущности просто напишите .setMaxResults(no of obj)