当前位置: 首页 > 知识库问答 >
问题:

如何限制Spring Data Repository中使用的@Query的结果

臧正平
2023-03-14

我正在通过Spring data JPA中的CrudRepository检索数据。我想过滤从@query注释中提供的自定义查询中检索到的记录。我尝试了。设置最大结果(20)用于选择行。但它会给出错误。我想筛选表中的前20行

这是我的存储库

package lk.slsi.repository;

import java.util.Date;
import lk.slsi.domain.SLSNotification;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

/**
 * Created by ignotus on 2/10/2017.
 */
public interface SLSNotificationRepository extends CrudRepository<SLSNotification, Integer> {


    @Override
    SLSNotification save(SLSNotification slsNotification);

    @Override
    SLSNotification findOne(Integer snumber);

    @Override
    long count();

    @Override
    void delete(Integer integer);

    @Override
    void delete(SLSNotification slsNotification);

    @Override
    void delete(Iterable<? extends SLSNotification> iterable);

    @Override
    List<SLSNotification> findAll();

    @Query("select a from SLSNotification a where a.slsiUnit in :unitList order by snumber desc")
    List<SLSNotification> getApplicationsByUnit(@Param("unitList") List<String> unitList);

    @Query("select a from SLSNotification a where a.userId = :userId")
    List<SLSNotification> getApplicationsByUserId(@Param("userId") String userId);

    @Query("select a.snumber, a.date, a.slsNo, a.slsiUnit, a.productDesc, a.status from SLSNotification a where a.userId = :userId ORDER BY snumber desc")
    List<SLSNotification> getApplicationsByUserIdforManage(@Param("userId") String userId);

    @Query("select a from SLSNotification a where a.slsNo = :slsNo")
    SLSNotification getApplicationBySLSNumber(@Param("slsNo") String slsNo);

}

我想要我的列表


共有3个答案

彭朝
2023-03-14

我发现LIMIT只能与在某些情况下可以使用的nativeQuery一起使用。

理想情况下,查询方法名称可以像这样使用:

EntityA findTopByParamXAndParamYAndParamZOrderByIdDesc();

它将把恢复限制为一个实体(一条记录)

在我的情况下,因为我有一个内部连接,我不能真正使用方法命名,我也会避免使用Ppage,因为它将逻辑委托给调用方。

我发现在查询中使用< code>MAX(a)是一个非常好的解决方案:

@Query(value = "SELECT MAX(a) FROM EntityA a " +
        "INNER JOIN EntityB b on a.Bid = b.id " +
        "WHERE b.paramY = :paramY " +
        "AND b.paramZ = :paramZ " +
        "AND a.paramX = :paramX " +
        "ORDER BY a.id DESC")
EntityA findLastEntityAByParamsXYZ(
        @Param("paramX") String paramX,
        @Param("paramY") String paramY,
        @Param("paramZ") String paramZ);
江向阳
2023-03-14
匿名用户

根据SpringDataJPA提供的通过方法名创建查询的特性,您可以使用它。有关更多支持的查询方法谓词关键字和修饰符,请选中此项。

Optional<List<SLSNotification>> findTop20ByUserId(String id); 

Optional<List<SLSNotification>> findFirst20ByUserId(String id); 

这将把查询结果限制为第一个结果。

如果要限制有序结果集,请在方法名称中使用DescAscOrderBy,如下所示。

// return the first 20 records which are ordered by SNumber. If you want Asc order, no need to add that keyword since it is the default of `OrderBy` 
Optional<List<SLSNotification>> findFirst20ByUserIdOrderBySNumberDesc(String id);  

建议-从代码方面来说,在查询中使用< code>Optional的返回类型更好也更安全,例如< code>find、< code>get,在这种情况下,对至少有一个结果存在疑问。

岳承悦
2023-03-14

您可以在SQL中通过limited语句提供限制。并在@Query注释中使用nativeQuery=true来设置JPA提供程序(如Hibernate)以将其视为本机SQL查询。

@Query(nativeQuery = true, value = "SELECT * FROM SLSNotification s WHERE s.userId = :userId ORDER BY snumber DESC LIMIT 20")
List<SLSNotification> getUserIdforManage(@Param("userId") String userId);

此外,如果您想利用Spring Data JPA的便捷功能,可以通过正确的方法命名来做到这一点。

List<SLSNotification> findByUserIdOrderBySNumber(@Param("userId") String userId, Pageable pageable);

如果您还不知道,SpringDataJPA会根据方法名构造Query。太棒了,对吧?阅读此文档以更好地理解。

现在只需调用此方法,如

Pageable topTwenty = PageRequest.of(0, 20);
List<SLSNotification> notifications = repository.findByUserIdOrderBySNumber("101", topTwenty);

您可以选择在界面中使用默认方法,让生活变得更轻松一些

 List<SLSNotification> findByUserIdOrderBySNumber(@Param("userId") String userId, Pageable pageable);

 default List<User> findTop20ByUserIdOrderBySNumber(String userId) {
    return findByUserIdOrderBySNumber(userId, PageRequest.of(0,20));
 }
 类似资料:
  • 问题内容: 我想知道是否可以限制SQL请求的结果? 例如,最多只返回以下内容的50行: 谢谢。 问题答案: 是的,这是可能的。这在数据库引擎之间有所不同。 Postgres: SQL Server: …

  • 问题内容: 以两个表为例:和。 列出产品详细信息,包括名称和ID,同时列出涉及产品的交易,包括日期,产品ID,客户等。 我需要显示一个网页,其中显示10个产品,每个产品的最近5个交易。到目前为止,如果mysql允许该部分,则似乎没有任何查询有效,并且下面的子查询也可以工作( 在“ where子句”中 出现 Unknown列“ ta.product_id”的 失败 :[ERROR:1054] )。

  • 嗨, 我正在创建Rest API,这是我的问题。例如,我有这样的@Query。 如何从我的类OrderDto中获取值并将其发送到@查询? 我还有其他问题,例如,我只发送一个单词,在这里我只需要使用: orderId来使用incoming String,但不知道如何将其用于incoming类。有什么想法吗? 我只想用同样的例子,但是从OrderDto到userDto这样的类。getCustomer

  • 问题内容: 如何限制从数据库检索到的结果数? 问题答案: 您可以这样尝试,以明确获取10个结果。 如果后端支持,它将自动在后端创建本机查询以检索特定数量的结果,否则将在获取所有结果后进行内存限制。

  • 我有一个要求,在Dynamodb中查询表时只需要返回一行。我可以在aws cli中看到一个名为“max items”的参数,它显然限制了查询的结果大小。以下是示例查询: 但我无法在Go中找到任何类似的关键字/属性。 以下是我可以找到的相关内容:如何使用Java设置DynamoDB返回的匹配项的限制?

  • 问题内容: 我需要查询里面有很多在它的数据的Sybase数据库,并希望设置限制,因此DB后10个结果停止查询。 关键的是性能,因此,如果找遍了所有结果,然后再回到过去的10个结果将是没有用的。 提前致谢 问题答案: 我相信你可以做一个,然后再在这个环节中的所有查询,直到进一步的将返回不超过10行。正如评论指出,这会影响 所有 在会议之后的查询(不只是S ^!),直至关闭(通过设置为0),或设置不同