Spring数据JPA findByDate总是返回一个空列表 [英] Spring data jpa findByDate is always returning an empty list

查看:417
本文介绍了Spring数据JPA findByDate总是返回一个空列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在应用程序中使用spring-data-jpa 1.9.2,mysql-connector 5.1和hibernate 4.3.11 Final.

I'm using in my application spring-data-jpa 1.9.2, mysql-connector 5.1 and hibernate 4.3.11 Final.

我的订单"类具有日期类型的创建"属性.

My Order class has a "creation" attribute of type date.

@Entity
public class Order implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private java.util.Date creation;
}

在我的JpaRepository中,我有以下两种方法来按日期获取订单:

In my JpaRepository I have these two methods to get the orders by date:

List<Order> findByCreation(Date date);
@Query("select o from Order o where o.creation = ?1")
List<Order> findByCreation2(Date date);

我没有例外,但是总是空列表,这可以帮助您理解:

I'm not having an exception, but always an empty list, this can help you understand:

Date date = new Date();
Order order = new Order(date);
orderRepository.save(order);
Date creationFromDB = orderRepository.findOne(1L).getCreation();
System.out.println("eq? : "+ creationFromDB.equals(order.getCreation()));
List<Order> ods = orderRepository.findByCreation(creationFromDB);
List<Order> ods2 = orderRepository.findByCreation2(creationFromDB;
System.out.println("\n ods.size: " + ods.size() +", ods2.size: "+ods2.size());

输出为:

eq? : true
ods.size: 0, ods2.size: 0

注意

选择请求正确执行了两次:

The select request had executed correctly and twice:

DEBUG org.hibernate.SQL - select order0_.id as id2_4_, order0_.creation as creation3_4_ from Orders order0_ where order0_.creation=?

我想念什么?

推荐答案

您是否生成了数据库方案?您是否尝试生成它?

Did you generate your db scheme? Have you tried to generate it?

如果可以生成(带拖放),请在application.properties中设置以下属性.

If it is possible to generate (with drop), set following property in your application.properties.

spring.jpa.hibernate.ddl-auto=create-drop

可能您的数据库中有不同的数据类型(例如,日期与日期时间),并由spring数据使用.我已经重新创建了您的项目,并且在H2和MySQL上都可以正常工作.

Potentially you have different data types (e.g. date vs. datetime) in you DB and used by spring data. I've recreated your project, and everithing worked fine whith H2 and MySQL.

尝试如下更新您的列说明:

Try to update your column description as follows:

@Column(name = "creation", columnDefinition="TIMESTAMP(6)")
@Temporal(TemporalType.TIMESTAMP)
private Date creation;

精度可能有所不同.查看我的代码:

There might be different precisions. See my code:

订单类.

@Entity
@Table(name = "Ordr")
public class Order implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @Column(name = "creation", columnDefinition="TIMESTAMP(6)")
    @Temporal(TemporalType.TIMESTAMP)
    private Date creation;

    // getters and setters
}

测试bean类.

@Component
public class SomeBean {

    @Autowired
    private OrderRepository orderRepository;

    @PostConstruct
    public void init() {

        Date date = new Date();

        Order order = new Order();
        order.setId(1L);
        order.setCreation(date);

        orderRepository.save(order);

        Date creationFromDB = orderRepository.findOne(1L).getCreation();

        System.out.println("eq? : "+ new Date(creationFromDB.getTime()).equals(order.getCreation()));
        List<Order> ods = orderRepository.findByCreation(creationFromDB);
        List<Order> ods2 = orderRepository.findByCreation2(creationFromDB);
        System.out.println("\n ods.size: " + ods.size() +", ods2.size: "+ods2.size());

    }
}

结果: eq? : 真的 ods.size:1,ods2.size:1

Result: eq? : true ods.size: 1, ods2.size: 1

数据库查询:

mysql> select * from ordr;
+----+----------------------------+
| id | creation                   |
+----+----------------------------+
|  1 | 2016-08-03 15:15:12.386000 |
+----+----------------------------+
1 row in set (0,00 sec)

这篇关于Spring数据JPA findByDate总是返回一个空列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆