2016-04-30 7 views
2

Ich verwende Hibernate 5 mit dem Hibernate-Java8-Addon, um LocalDateTime Felder zu verwenden. Ich habe jetzt eine Einheit, die ein Datumsfeld und ein Benutzerfeld wie in hat:Hibernate: Verwenden von LocalDateTime zum Abfragen eines Bereichs

@Entity 
public class Transaction { 
    // ... 
    private User user; 
    private LocalDateTime date; 
    // .. 
} 

Jetzt habe ich einfach alle Transaktionen eines Benutzers innerhalb eines bestimmten Zeitbereich abfragen möchten. Also verwende ich die folgende Abfrage:

SELECT t FROM Transaction t WHERE t.user = :owner AND t.date BETWEEN :from AND :to 

Seltsam genug, diese Abfrage gibt mir keine Ergebnisse. Ich habe auch versucht, die < und > Operatoren zu verwenden, aber das half auch nicht. Wenn ich den Zeitbereich auslasse, bekomme ich die korrekte Liste der Transaktionen für den Benutzer. Wenn ich die von Hibernate in der MySQL-Workbench erzeugte SQL-Abfrage ausführe, bekomme ich auch die erwarteten Ergebnisse. Ich verwende den folgenden Ausschnitt der (benannt) Abfrage auszuführen:

public <T> List<T> findList(Class<T> type, String queryName, 
     Map<String, Object> params) { 
    final EntityManager em = this.entityManager.get(); 
    final TypedQuery<T> query = em.createNamedQuery(queryName, type); 
    params.forEach(query::setParameter); 
    return query.getResultList(); 
} 

Dieses einfach genannt wird die Abfrage oben und eine Karte von benannten Parametern wie aufgeführt bereitstellt:

findList(Transaction.class, Transaction.BY_USER_AND_RANGE, 
      ImmutableMap.of("owner", owner, "from", from, "to", to)); 

In meinem Testfall ein beharrte eine einzelne Transaktion mit dem aktuellen Datum und einen Bereich von gestern bis morgen für die Abfrage erstellt. Die Überprüfung der Tabelle in der MySQL-Workbench zeigt, dass die Transaktion vorhanden ist und dass das Datumsfeld den richtigen Typ hat und den richtigen Wert enthält. Aber meine Abfrage wird mir keine Ergebnisse geben.

Gibt es etwas, was ich vermisse?

+2

Was die Werte sind von und nach sein sollte? Die logische Erklärung, wenn das von größer ist als zu. Oder dass deine Daten nicht zwischen ihnen liegen. –

Antwort

2

Das Datum, das Sie als param passieren, werden auch

Local siehe das Beispiel-Code unten könnte Ihnen helfen,

LocalDate date = LocalDate.of(2015, 8, 11); 
TypedQuery<MyEntity> query = this.em.createQuery("SELECT e FROM MyEntity e WHERE date BETWEEN :start AND :end", MyEntity.class); 
query.setParameter("start", date.minusDays(2)); 
query.setParameter("end", date.plusDays(7)); 
MyEntity e = query.getSingleResult();