java – 使用Date参数时的Spring Data JPA日期“之间”查询问题

前端之家收集整理的这篇文章主要介绍了java – 使用Date参数时的Spring Data JPA日期“之间”查询问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在我的应用程序中,我使用Spring Data和hibernate作为JPA提供程序来持久化和读取数据.

我有顶级实体类:

  1. @Entity
  2. @Getter @Setter
  3. @Table(name = "operation")
  4. @Inheritance(strategy = InheritanceType.JOINED)
  5. @EqualsAndHashCode(of = {"operationId"})
  6. public abstract class Operation implements Serializable {
  7. public static final int OPERATION_ID_LENGTH = 20;
  8. @Id
  9. @Column(name = "operation_id",length = OPERATION_ID_LENGTH,nullable = false,columnDefinition = "char")
  10. private String operationId;
  11. @Column(name = "operation_type_code")
  12. @Getter(AccessLevel.NONE)
  13. @Setter(AccessLevel.NONE)
  14. private String operationTypeCode;
  15. @Temporal(TemporalType.TIMESTAMP)
  16. @Column(name = "begin_timestamp",nullable = false)
  17. private Date beginTimestamp = new Date();
  18. @Temporal(TemporalType.TIMESTAMP)
  19. @Column(name = "end_timestamp")
  20. private Date endTimestamp;
  21. @Column(name = "operation_number",length = 6,columnDefinition = "char")
  22. private String operationNumber;
  23. @Enumerated(EnumType.STRING)
  24. @Column(name = "operation_status",length = 32,nullable = false)
  25. private OperationStatus status;
  26. @ManyToOne(optional = false)
  27. @JoinColumn(name = "user_id")
  28. private User user;
  29. @ManyToOne
  30. @JoinColumn(name = "terminal_id")
  31. private Terminal terminal;
  32. @Column(name = "training_mode",nullable = false)
  33. private boolean trainingMode;
  34. }

对于继承的类,我有相应的存储库:

  1. public interface ConcreteOperationRepository extends JpaRepository

我用以下方法进行集成测试:

  1. @Transactional
  2. @Test
  3. public void shouldFindOperationByPeriodAndStatusAndWorkstationId() {
  4. Date from = new Date(Calendar.getInstance().getTime().getTime());
  5. List

但是由于结果为空而我使用MysqL数据库时此测试失败(但是当我切换到HsqlDB时通过)

此外,如果我在测试开始时将延迟“Thread.sleep(1000)”延迟一秒,就在第一行之后,则此测试通过.

当我从Hibernate日志执行sql时,它给了我正确的结果.我的代码出了什么问题?

最佳答案
在JPA中,日期需要时间提示.通常,您可以在设置JPA Query参数时设置TemporalType:

  1. query.setParameter("from",from),TemporalType.TIMESTAMP);

使用Spring Data,您需要使用@Temporal注释,因此您的查询将变为:

  1. @Query("SELECT o FROM ConcreteOperation o WHERE o.beginTimestamp BETWEEN :from AND :to AND o.status = :status AND o.terminal.deviceId = :deviceId AND o.trainingMode = :trainingMode")
  2. Collection

猜你在找的Spring相关文章