JPQL 限制查询 [重复]

Posted

技术标签:

【中文标题】JPQL 限制查询 [重复]【英文标题】:JPQL limit query [duplicate] 【发布时间】:2014-01-07 21:01:57 【问题描述】:

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

但徒劳无功!!!

请推荐

【问题讨论】:

【参考方案1】:

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

例子:

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

【讨论】:

【参考方案2】:

如果您使用的是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 个 SQL 查询:一个查询带有 LIMIT 的 SELECT,第二个查询带有 SELECT COUNT 的页面元数据 totalElements。当查询包含一些额外的 WHERE 子句时,这可能会很慢。 就像一个魅力,但有一个例外 - 我必须将我的查询设置为原生,否则,它不会运行我的 Spring Boot 应用程序。 @Query(value = "SELECT mm FROM MyModel mm", nativeQuery = true) 非常有用谢谢??【参考方案3】:

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

不是很顺利,但确实可以。

【讨论】:

【参考方案4】:

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

【讨论】:

相同的答案:***.com/a/20679415/1170330

以上是关于JPQL 限制查询 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

JPQL/HSQL 更新有限制?

我可以将 JPQL 的结果限制为只返回一个结果吗?

限制 SQL 查询中每个 id 的行数 [重复]

使用“限制”查询不返回结果[重复]

Spring Data JPA自定义查询限制功能不起作用[重复]

将连接查询中的重复值限制为仅显示第一个实例