Предельный запрос 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)