title: Spring Data JPA date "between" query issue when using Date parameters
body: <p>In my application, I am using Spring Data and hibernate as JPA provider to persist and read data.</p>
  
  <p>I have top level Entity class:</p>
  
  <pre><code>@Entity
  @Getter @Setter
  @Table(name = "operation")
  @Inheritance(strategy = InheritanceType.JOINED)
  @EqualsAndHashCode(of = {"operationId"})
  public abstract class Operation implements Serializable {
      public static final int OPERATION_ID_LENGTH = 20;
  
      @Id
      @Column(name = "operation_id", length = OPERATION_ID_LENGTH, nullable = false, columnDefinition = "char")
      private String operationId;
  
      @Column(name = "operation_type_code")
      @Getter(AccessLevel.NONE)
      @Setter(AccessLevel.NONE)
      private String operationTypeCode;
  
      @Temporal(TemporalType.TIMESTAMP)
      @Column(name = "begin_timestamp", nullable = false)
      private Date beginTimestamp = new Date();
  
      @Temporal(TemporalType.TIMESTAMP)
      @Column(name = "end_timestamp")
      private Date endTimestamp;
  
      @Column(name = "operation_number", length = 6, columnDefinition = "char")
      private String operationNumber;
  
  
      @Enumerated(EnumType.STRING)
      @Column(name = "operation_status", length = 32, nullable = false)
      private OperationStatus status;
  
      @ManyToOne(optional = false)
      @JoinColumn(name = "user_id")
      private User user;
  
      @ManyToOne
      @JoinColumn(name = "terminal_id")
      private Terminal terminal;
  
  
      @Column(name = "training_mode", nullable = false)
      private boolean trainingMode;
  }
  </code></pre>
  
  <p>For inherited class I have corresponding repository:</p>
  
  <pre><code>public interface ConcreteOperationRepository extends JpaRepository&lt;ConcreteOperation, String&gt; {
  
      @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")
      Collection&lt;ConcreteOperation&gt; findOperations(@Param("from") Date startDay,
                                                     @Param("to") Date endDay,
                                                     @Param("status") OperationStatus status,
                                                     @Param("deviceId") String deviceId,
                                                     @Param("trainingMode") boolean trainingMode);
  }
  </code></pre>
  
  <p>And I have integration test with following method:</p>
  
  <pre><code>@Transactional
  @Test
  public void shouldFindOperationByPeriodAndStatusAndWorkstationId() {
      Date from = new Date(Calendar.getInstance().getTime().getTime());
      List&lt;String&gt; terminalIds = loadTerminalIds();
      List&lt;OperationStatus&gt; typeForUse = Arrays.asList(OperationStatus.COMPLETED,
              OperationStatus.LOCKED, OperationStatus.OPEN);
      int countRowsForEachType = 3;
      int id = 100001;
      for (String terminalId : terminalIds) {
          for (OperationStatus status : typeForUse) {
              for (int i = 0; i &lt; countRowsForEachType; i++) {
                  concreteOperationRepository.save(createConcreteOperation(status, terminalId,
                          String.valueOf(++id)));
              }
          }
      }
      Date to = new Date(Calendar.getInstance().getTime().getTime());
      for (String terminalId : terminalIds) {
          for (OperationStatus status : typeForUse) {
              Collection&lt;ConcreteOperation&gt; operations =
                      concreteOperationRepository.findOperations(from, to, status, terminalId, false);
              assertEquals(countRowsForEachType, operations.size());
          }
      }
  }
  </code></pre>
  
  <p>But this test fails when I using MySql database due to empty result (but passes when I switch to HSQLDB)</p>
  
  <p>Also, this test passes if I put delay "Thread.sleep(1000)" for one second at the beginning of the test, just after the first line.</p>
  
  <p>When I execute SQL from Hibernate log it gives me right result. What's wrong with my code?</p>