这个问题已经在这里有一个答案:
我怎样才能在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")
但不成功!
请建议
JPQL
不提供一种机制来限制查询。这是最经常使用的setMaxResults()
的Query
方法实现。如果你必须避免在Java代码中指定这个,你能在包含查询并执行限制数据库的视图。然后,一个实体映射到这个观点,你会表。
例:
List<String> resultList= query.setMaxResults(100).getResultList();
如果您正在使用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一个更完整的答案。
对于具体的@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
)
不是很顺利,但做这项工作。
而执行与实体管理器的查询只写.setMaxResults(无obj的)