【问题标题】:Spring data jpa findByDate is always returning an empty listSpring data jpa findByDate 总是返回一个空列表
【发布时间】:2016-12-08 14:29:29
【问题描述】:

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

我的订单类有一个日期类型的“创建”属性。

@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 中,我有这两种方法来按日期获取订单:

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

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

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

注意

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

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

我错过了什么?

【问题讨论】:

    标签: java mysql sql date spring-data


    【解决方案1】:

    我可能错了:

    1. 你需要描述“创造”属性

      @Column(name = "db_column_name")
      私有日期创建;

    2. 我也建议在课堂和数据库中使用 Timestamp。时间戳更有用。

    希望能帮到你

    【讨论】:

    • 我在 Timestamp 上遇到了同样的问题。
    【解决方案2】:

    查看您的代码,我假设您使用的是 java.util.Date。如果是这样,请在实体中使用以下内容:

     @Temporal(TemporalType.TIMESTAMP)
     private Date creation;
    

    如果您在数据库中的列被定义为时间戳类型。如果您在列中使用纯日期部分,请使用TemporalType.DATE

    如果您使用的是java.sql.Date,则不需要。

    【讨论】:

    • 我已将列类型更改为 java.sql.Date 并且它正在工作。谢谢。
    • 但问题是我无法节省时间,我试过 sql.Timestamp 但仍然遇到上面同样的问题。
    • 你有什么例外吗?
    • 不。同样的问题。
    • 您说您使用的是java.sql.Date。您是否相应地更改了上面发布的代码?我的意思是保存order 实例的代码。
    【解决方案3】:

    您是否生成了您的数据库方案?你试过生成它吗?

    如果可以生成(使用 drop),请在 application.properties 中设置以下属性。

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

    您的数据库中可能有不同的数据类型(例如日期与日期时间)并被弹簧数据使用。我已经重新创建了您的项目,并且使用 H2 和 MySQL 一切正常。

    编辑:

    尝试如下更新您的列描述:

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

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

    订单类。

    @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());
    
        }
    }
    

    结果: 情商? : 真的 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)
    

    【讨论】:

    • 我当然是在生成方案,它也是create-drop。请注意,我的创建属性是 java.util.date 类型的。
    • 是否可以使用更新版本的休眠?你用spring-boot吗?
    • 查看我的更新。添加了我的解决方案,我有预期的结果。请检查是否有帮助。
    • 我认为问题出在数据库列类型中,看起来是日期时间类型,所以columnDefinition="TIMESTAMP(6)" 修复了这个问题。谢谢。
    • 默认情况下,DB 中存储的精度可能与 java.util.Date 实现中使用的精度不同。它的存储时间不超过毫秒,因此如果您使用带有“eq”条件的 newDate() 查询值,很可能您什么也找不到。
    猜你喜欢
    • 2018-08-08
    • 2019-10-10
    • 2020-12-14
    • 2022-07-21
    • 2021-09-03
    • 2017-04-13
    • 2021-11-27
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多