我在我的应用程序中使用spring-data-jpa 1.9.2,mysql-connector 5.1和hibernate 4.3.11 Final。
我的Order类有一个类型为date的“creation”属性。
@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=?
我错过了什么?
答案 0 :(得分:1)
查看代码,我假设您使用的是java.util.Date。如果是这样,请在实体中使用以下内容:
@Temporal(TemporalType.TIMESTAMP)
private Date creation;
如果数据库中的列定义为timestamp类型。如果您在列中使用纯日期部分,请使用TemporalType.DATE
。
如果您使用的是java.sql.Date
,则不需要这样做。
答案 1 :(得分:1)
您是否生成了数据库方案?你试过生成它吗?
如果可以生成(使用drop),请在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());
}
}
结果: 情商? :是的 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)
答案 2 :(得分:0)
我错了:
你需要描述&#34;创造&#34;属性
@Column(name =&#34; db_column_name&#34;)
私人日期创建;
我推荐在课堂上和DB中使用Timestamp。时间戳更有用。
我希望能帮助