Java Spring数据存储库:";查找“;带有orderBy的方法获取错误的顺序

Java Spring数据存储库:";查找“;带有orderBy的方法获取错误的顺序,java,spring-boot,spring-data,spring-data-jpa,jpql,Java,Spring Boot,Spring Data,Spring Data Jpa,Jpql,我有一个带有一些JPA存储库的Spring启动应用程序。 我在其中一个存储库接口中定义了以下方法: public List<Post> findAllByOrderByPublishedOnDesc(); 存储库: public interface PostRepository extends JpaRepository<Post, Long> { public Post findBySourceUrl(String source

我有一个带有一些JPA存储库的Spring启动应用程序。 我在其中一个存储库接口中定义了以下方法:

    public List<Post> findAllByOrderByPublishedOnDesc();
存储库:

    public interface PostRepository extends JpaRepository<Post, Long>
    {
        public Post findBySourceUrl(String sourceUrl);
        public List<Post> findAllByOrderByPublishedOnDesc();
    }
公共接口PostRepository扩展了JpaRepository
{
公共Post findBySourceUrl(字符串sourceUrl);
公共列表findAllByOrderByPublishedOnDesc();
}
测试:

公共类OrderByJPATest
{
@自动连线
postRepo;
PublicOrderByJPatest()
{
}
@试验
public void testOrderByDays()
{
//第一次尝试:年长1天
Post-newer=insertTestEntity(“newer”,LocalDateTime.of(2016,11,13,0,0));
Post-older=insertTestEntity(“older”,LocalDateTime.of(2016,11,12,0,0));
List ordered=postRepo.findAllByOrderByPublishedOnDesc();
ordered.stream().forEach((post)->log.info(“{}=>{}”,post.getSourceUrl(),post.getPublishedOn());
/*
输出:
更新=>2016-11-13T00:00
老年人=>2016-11-12T00:00
*/
assertTrue(ordered.get(0.getPublishedOn)()
.isAfter(ordered.get(1.getPublishedOn());
postRepo.deleteAll();
回购后冲水();
//第二次尝试:老了1分钟
更新=插入测试实体(“newerbymin”,LocalDateTime.of(2016,11,13,01,02));
older=插入测试实体(“olderbymin”,LocalDateTime.of(2016,11,13,01,01));
ordered=postRepo.findAllByOrderByPublishedOnDesc();
ordered.stream().forEach((post)->log.info(“{}=>{}”,post.getSourceUrl(),post.getPublishedOn());
/* 
输出:
Olderbymin=>2016-11-13T01:01
newerbymin=>2016-11-13T01:02
*/
//这个断言失败了!
assertTrue(ordered.get(0.getPublishedOn)()
.isAfter(ordered.get(1.getPublishedOn());
}
private Post insertTestEntity(字符串url、LocalDateTime publishDate)
{
Text Text=新文本();
text.setValue(“测试…”);
Post Post=新Post();
post.setPublishedOn(publishDate);
post.setSourceUrl(url);
post.setText(文本);
返回回购后保存(post);
}
}
POM(依赖项):


com.atlassian.commonmark
普通商标
0.6.0
公地io
公地io
2.4
公地郎
公地郎
2.6
org.springframework.boot
弹簧靴起动器
org.springframework.boot
spring引导启动器数据jpa
org.springframework.boot
弹簧启动启动器数据rest
org.projectlombok
龙目
org.springframework.boot
弹簧启动安全
org.springframework.boot
弹簧启动装置
org.springframework.boot
SpringBootStarterWeb
org.springframework.boot
spring启动程序日志记录
org.thymeleaf.extras
thymeleaf-extras-Java8时间
com.h2数据库
氢
运行时
org.springframework.boot
弹簧起动试验
测试
org.springframework.security
弹簧安全性试验
测试

JPA默认情况下会将Java的
LocalDateTime
映射到
BLOB
,而不是
DateTime
时间戳

数据库不了解如何对BLOB执行日期/时间排序

  • 确保使用适当的数据类型(使用
    @Column
    注释或SQL脚本)创建架构
  • hibernate-java8
    依赖项添加到项目中

  • 执行上述步骤后,将进行正确的排序。

    您是否尝试映射到java.util.Date并查看这是否会改变行为?@neil stockton您使用的是哪个版本的Spring Boot?如果您已经覆盖了任何依赖版本,请告诉我。@punkrocker27ka我使用的是1.4.1.RELEASE,我的版本中没有排除或覆盖POM@JustinKSU有趣的是:从LocalDateTime切换到Date我得到了正确的顺序:
    NewerbyMin=>Wed Dec 13 01:02:00 CET 3916 OlderbyMin=>Wed Dec 13 01:01:00 CET3916
    您可以共享您的pom文件吗。我很好奇你是否带来了jackson-datatype-jsr310?我有
    hibernate-java8
    ,但它仍然不起作用。也许我错过了你回答的第一点。该列的合适定义是什么?你能举个例子吗?非常感谢。@EvilToad我在SQL for Java的LocalDateTime中使用了时间戳数据类型。看到这个完整的工作示例:钉住它!现在,它的工作如预期。非常感谢你的努力。
        public interface PostRepository extends JpaRepository<Post, Long>
        {
            public Post findBySourceUrl(String sourceUrl);
            public List<Post> findAllByOrderByPublishedOnDesc();
        }
    
        public class OrderByJPATest
        {
        @Autowired
        PostRepository postRepo;
    
        public OrderByJPATest()
        {
        }
    
        @Test
        public void testOrderByDays()
        {
                // First try: older by 1 day
                Post newer = insertTestEntity("newer", LocalDateTime.of(2016, 11, 13, 0, 0));
                Post older = insertTestEntity("older", LocalDateTime.of(2016, 11, 12, 0, 0));
    
                List<Post> ordered = postRepo.findAllByOrderByPublishedOnDesc();
    
                ordered.stream().forEach((post) -> log.info("{} => {}", post.getSourceUrl(), post.getPublishedOn()));
    
                /*
                output:
                newer => 2016-11-13T00:00
                older => 2016-11-12T00:00
                */
    
                assertTrue(ordered.get(0).getPublishedOn()
                        .isAfter(ordered.get(1).getPublishedOn()));
    
                postRepo.deleteAll();
                postRepo.flush();
    
                // Second try: older by 1 minute
                newer = insertTestEntity("newerBy1Min", LocalDateTime.of(2016, 11, 13, 01, 02));
                older = insertTestEntity("olderBy1Min", LocalDateTime.of(2016, 11, 13, 01, 01));
    
                ordered = postRepo.findAllByOrderByPublishedOnDesc();
    
                ordered.stream().forEach((post) -> log.info("{} => {}", post.getSourceUrl(), post.getPublishedOn()));
    
                /* 
                output:
                olderBy1Min => 2016-11-13T01:01
                newerBy1Min => 2016-11-13T01:02
                */
    
                // this assert fails!
                assertTrue(ordered.get(0).getPublishedOn()
                        .isAfter(ordered.get(1).getPublishedOn()));
        }
    
        private Post insertTestEntity(String url, LocalDateTime publishDate)
        {
                Text text = new Text();
                text.setValue("Testing...");
                Post post = new Post();
                post.setPublishedOn(publishDate);
                post.setSourceUrl(url);
                post.setText(text);
    
                return postRepo.save(post);
        }
        }
    
       <dependencies>
    
            <dependency>
                <groupId>com.atlassian.commonmark</groupId>
                <artifactId>commonmark</artifactId>
                <version>0.6.0</version>
            </dependency>
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.4</version>
            </dependency>
            <dependency>
                <groupId>commons-lang</groupId>
                <artifactId>commons-lang</artifactId>
                <version>2.6</version>
            </dependency>
            <!--Additional dependencies -end-->
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-rest</artifactId>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-security</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.thymeleaf.extras</groupId>
                <artifactId>thymeleaf-extras-java8time</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>