上次插入的springdata findall条目

643ylb08  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(380)

假设数据库中有以下条目:
标识身份PartLastModifiedDatate1Entity1Part128.12.20202 Entity2Part128.12.20203 Entity3Part228.12.20204 Entity1Part130.12.20205 Entity3Part231.12.2020
现在,如果我想使用spring数据来查找具有较新lastmodifieddata字段的条目,我可以通过定义以下方法来找到它

findFirstByEntityIdAndEntityPartOrderByLastModifiedDateTimeDesc(String entityId, String entityPart)

是否有任何方法可以返回所有条目的列表,其中只包含具有较新lastmodifieddate的条目,因此在我们的示例中,它应该返回仅包含ID为2、4、5的条目的列表,对于这些条目,它们具有较新的lastmodifieddate。
Edit1作为解决方案,我使用了如下sql查询,还定义了分页修复

@Query(value = "SELECT * FROM orders AS or WHERE LAST_MODIFIED_DATE =\n" +
        "      (SELECT MAX(LAST_MODIFIED_DATE)\n" +
        "       FROM orders \n" +
        "       WHERE (ENTITY_ID = or.ENTITY_ID AND ENTITY_PART = or.ENTITY_PART))"
       countQuery = "SELECT COUNT(*) FROM (\n" +
        "         SELECT MAX(LAST_MODIFIED_DATE) as or\n" +
        "         FROM orders \n" +
        "         GROUP BY ENTITY_ID , ENTITY_PART) AS order")
       nativeQuery = true)
e0bqpujr

e0bqpujr1#

在这种情况下 After 应使用以下关键字:
(我保持与您示例中相同的顺序)

List<YourEntityType> findByLastModifiedDateAfterOrderByLastModifiedDateTimeDesc(Date lastModifiedDateAfter)

但是,这还不够。首先,您需要找到最后一个(使用您提供的查询),然后查询具有该值的实体。这不能通过一个存储库查询来完成,但可以通过定义 default 方法。请注意 @Transactional 注解时,查询应在一个事务中运行,否则结果可能不一致。
例子:

public interface ExampleRepository extends CrudRepository<YourEntityType, Long> {

YourEntityType findFirstByEntityIdAndEntityPartOrderByLastModifiedDateTimeDesc(String entityId, String entityPart);

List<YourEntityType> findByLastModifiedDateAfterOrderByLastModifiedDateTimeDesc(Date lastModifiedDateAfter);

@Transactional
default List<YourEntityType> findByLastModifiedDateOrderByLastModifiedDateTimeDesc(String entityId, String entityPart) {
    YourEntityType last = findFirstByEntityIdAndEntityPartOrderByLastModifiedDateTimeDesc(entityId, entityPart);
    return findByLastModifiedDateAfterOrderByLastModifiedDateTimeDesc(last.getLastModifiedDateAfter());
}

}
裁判:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-方法.查询创建

ar7v8xwq

ar7v8xwq2#

因为您使用的是没有时间的日期,所以条目上有重复日期的危险。若您可以修改数据库,只需将布尔值添加到其中以标识最新条目。然后,您可以使用list findbyboolean(boolean true);
你应该考虑使用时间的日期,以避免以后的并发症。

相关问题