我正在通过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);
}
我想要我的列表
我发现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);
根据SpringDataJPA提供的通过方法名创建查询的特性,您可以使用它。有关更多支持的查询方法谓词关键字和修饰符,请选中此项。
Optional<List<SLSNotification>> findTop20ByUserId(String id);
或
Optional<List<SLSNotification>> findFirst20ByUserId(String id);
这将把查询结果限制为第一个结果。
如果要限制有序结果集,请在方法名称中使用Desc
、Asc
和OrderBy
,如下所示。
// 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,在这种情况下,对至少有一个结果存在疑问。
您可以在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),或设置不同