CrudRepository:返回一个结果,按列排序[重复]

Posted

技术标签:

【中文标题】CrudRepository:返回一个结果,按列排序[重复]【英文标题】:CrudRepository: Return one result, ordered by a column [duplicate] 【发布时间】:2015-04-25 03:15:14 【问题描述】:

有没有办法让 CrudRepository 接口对包含多行的表进行排序并简单地返回第一行,例如按时间戳排序以仅返回最新行?

public interface ImportReceiptRepository extends CrudRepository<ImportReceipt, Long>

    ImportReceipt getOneByImportTypeOrderByTimestampDesc(String importType);
    ImportReceipt findOneByImportTypeOrderByTimestampDesc(String importType);

findOneBy... 和 getOneBy... 都抛出:

org.springframework.dao.IncorrectResultSizeDataAccessException: result returns more than one elements; nested exception is javax.persistence.NonUniqueResultException: result returns more than one elements
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:395)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:216)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor$LockModePopulatingMethodIntercceptor.invoke(LockModeRepositoryPostProcessor.java:105)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy109.findOneByImportTypeOrderByTimestampDesc(Unknown Source)
at edu.ucdavis.dss.dw.services.DefaultImportReceiptService.getLatestOneByImportType(DefaultImportReceiptService.java:26)
...

或者,换句话说,CrudRepository 相当于:

SELECT * FROM ImportReceipts ORDER BY timestamp DESC LIMIT 0,1;

【问题讨论】:

不确定它是否重复:那个答案和它反过来的一个重复是指拥有 JPA Query 对象,而 CrudRepository 不是这种情况。 看起来 Bludream 来自 ***.com/questions/9314078/… 的答案正是我想要的。语法是“findFirst”或“findTop10”,尽管它仍然返回一个列表。感谢 holmis83 的帮助,您的链接让我走上了正确的道路。 啊,我不知道它与“标准”JPA 如此不同。嗯,我学到了一些新东西。 【参考方案1】:

来自 setMaxResults for Spring-Data-JPA annotation?... 的 Bludream 的回答有答案。

语法是“findFirst”或“findTop10”,但它仍然返回一个列表。

List<ImportReceipt> findFirstByImportTypeOrderByTimestampDesc(String importType);

我想 List 的 size() 永远是 0 或 1。

【讨论】:

对我来说,这个方法返回一个列表,其大小等于所有具有 importType 的行

以上是关于CrudRepository:返回一个结果,按列排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB 常用数据处理命令

列排(list)排序

联合两个查询结果按列

按列拆分查询结果的最佳实践

在我的情况下,如何编写自定义 CrudRepository 方法(@Query)来过滤结果

在扩展 CrudRepository 的接口中缓存可分页对象(结果)