JPQL限制查询[复制]

问题描述 投票:30回答:4

这个问题已经在这里有一个答案:

我怎样才能在JPQL的命名查询选择查询限制?我需要在查询级别本身做了限制,而不是在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")

但不成功!

请建议

java jpa-2.0 limit jpql
4个回答
36
投票

JPQL不提供一种机制来限制查询。这是最经常使用的setMaxResults()Query方法实现。如果你必须避免在Java代码中指定这个,你能在包含查询并执行限制数据库的视图。然后,一个实体映射到这个观点,你会表。

例:

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

29
投票

如果您正在使用spring-data你应该使用Pageable Interface工作。下面的样品代码,

我的服务,

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

}

您可以找到有关春天的数据可用选项here一个更完整的答案。


7
投票

对于具体的@NamedQueries在需要限制,您可以切换到@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
)

不是很顺利,但做这项工作。


-1
投票

而执行与实体管理器的查询只写.setMaxResults(无obj的)

© www.soinside.com 2019 - 2024. All rights reserved.