我在我的应用程序中使用spring-data-jpa 1.9.2,mysql-connector 5.1和hibernate 4.3.11 Final。
我的Order类具有日期类型的“创建”属性。
@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=?
我想念什么?
您是否生成了数据库方案?您是否尝试生成它?
如果可以生成(带删除),请在application.properties中设置以下属性。
spring.jpa.hibernate.ddl-auto=create-drop
可能您的数据库中具有不同的数据类型(例如,日期与日期时间),并由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()); } }
结果:等于?: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)