Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring数据jpa findByDate总是返回一个空列表_Java_Mysql_Sql_Date_Spring Data - Fatal编程技术网

Java Spring数据jpa findByDate总是返回一个空列表

Java Spring数据jpa findByDate总是返回一个空列表,java,mysql,sql,date,spring-data,Java,Mysql,Sql,Date,Spring Data,我在应用程序中使用的是spring数据JPA1.9.2、mysql连接器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

我在应用程序中使用的是spring数据JPA1.9.2、mysql连接器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);
注意

select请求已正确执行两次:

DEBUG org.hibernate.SQL - select order0_.id as id2_4_, order0_.creation as creation3_4_ from Orders order0_ where order0_.creation=?
我错过了什么?

我可能错了:

  • 您需要描述“创建”属性

    @列(name=“db\u Column\u name”)
    私人日期创建

  • 我建议在类和数据库中使用时间戳。时间戳更有用


  • 我希望能帮助您查看代码,我假设您使用的是java.util.Date。如果是,请在实体中使用以下内容:

     @Temporal(TemporalType.TIMESTAMP)
     private Date creation;
    
    如果数据库中的列定义为timestamp类型。如果在列中使用纯日期部分,请使用
    TemporalType.date


    如果您使用的是
    java.sql.Date

    您是否生成了db方案,则不需要此选项?你试过生成它吗

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

    spring.jpa.hibernate.ddl-auto=create-drop
    
    数据库中可能有不同的数据类型(例如date和datetime),spring数据使用这些数据类型。我已经重新创建了您的项目,所有这些都使用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());
    
        }
    }
    

    我已经将我的列类型更改为java.sql.Date,它正在工作。谢谢。但问题是我不能节省时间,我已经尝试了sql.Timestamp,但仍然遇到了上面同样的问题。你有任何异常吗?没有。同样的问题。你说你正在使用
    java.sql.Date
    。您是否相应地更改了上面发布的代码?我指的是保存
    订单
    实例的代码。我的时间戳也有同样的问题。当然,我正在生成方案,它也是create drop。请注意,我的创建属性的类型是java.util.date。是否可以使用更新版本的hibernate?您使用spring boot吗?请参阅我的更新。添加了我的解决方案,我得到了预期的结果。请检查这是否有帮助。我认为问题出在数据库列类型中,看起来是datetime类型,因此
    columnDefinition=“TIMESTAMP(6)”
    修复了问题。谢谢。默认情况下,数据库中存储的精度可能与java.util.Date实现中使用的精度不同。它的存储时间没有毫秒,因此,如果使用带有“eq”条件的newDate()查询值,很可能找不到任何内容。
    @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
    }
    
    @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());
    
        }
    }
    
    mysql> select * from ordr;
    +----+----------------------------+
    | id | creation                   |
    +----+----------------------------+
    |  1 | 2016-08-03 15:15:12.386000 |
    +----+----------------------------+
    1 row in set (0,00 sec)