2013-12-19 125 views
15

如何限制JPQL命名查询的选择查询?我需要在查询级别本身而不是在java层完成限制! 我正在尝试使用JPQL限制查询

@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") 

但徒劳无益!!!

请建议

回答

22

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

实施例:

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

,同时用实体管理器执行查询只写.setMaxResults

2

对于特定@NamedQueries其中需要限制(无OBJ),就可以切换到@NamedNativeQuery

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

不尽如人意,但做的工作。

16

如果您使用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); 

} 
+0

这正是我一直在寻找,并通过所有的搜索,只有你一提这个方式...谢谢... –