JPQL限制查询

use*_*056 33 java limit jpql jpa-2.0

如何限制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")
Run Code Online (Sandbox Code Playgroud)

但是徒劳!

请建议

Kev*_*sox 41

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

例:

List<String> resultList= query.setMaxResults(100).getResultList();
Run Code Online (Sandbox Code Playgroud)


Geo*_*lou 30

如果您使用的是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));
    }
}
Run Code Online (Sandbox Code Playgroud)

我的存储库,

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

}
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到有关弹簧数据可用选项的更完整答案.

  • 这正是我一直在寻找的东西,在所有搜索中,只有你这样提到......谢谢...... (2认同)
  • 请注意,此解决方案将启动 2 个 SQL 查询:一个查询使用 LIMIT 的 SELECT,第二个查询使用 SELECT COUNT 查询页面的元数据 totalElements。当查询包含一些额外的 WHERE 子句时,这可能会很慢。 (2认同)

mut*_*nUp 8

对于需要限制的特定@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
)
Run Code Online (Sandbox Code Playgroud)

不太顺利,但做的工作.