JPQL限制查询

时间:2013-12-19 10:32:55

标签: java jpa-2.0 limit jpql

如何限制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")

但徒劳无功!!!

请建议

4 个答案:

答案 0 :(得分:33)

JPQL不提供限制查询的机制。这通常是通过setMaxResults()上的Query方法实现的。如果必须避免在Java代码中指定它,则可以在包含查询的数据库中创建视图并执行限制。然后像实例一样将实体映射到此视图。

示例:

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

答案 1 :(得分:27)

如果您使用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的更完整答案。

答案 2 :(得分:5)

对于需要限制的特定@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
)

不太顺利,但做得很好。

答案 3 :(得分:0)

在使用实体管理器执行查询时,只需写入.setMaxResults(no of obj)