web-dev-qa-db-fra.com

JPA - Renvoyer des entités qui sont After StartDate et Before EndDate

J'ai deux dates dans mon entité. c'est à dire.

Date startDate;
Date endDate;

Comment interroger-je pour qu'une date donnée renvoie toutes les entités dont la date spécifiée est comprise entre startDate et endDate?

J'ai déjà essayé ce qui suit:

findByStartDateAfterAndEndDateBefore(Date givenDate);

Et Spring-Data-JPA n'aimait pas cela et se heurtait à des erreurs. Il n'y a pas d'erreur spécifique et le référentiel ne peut tout simplement pas être injecté dans ma classe.

Quelle est la bonne manière? Je sais que cela peut se faire facilement avec les critères Hibernate ou Native SQL, mais en essayant de le faire dans Spring JPA.

Est-ce un problème avec la requête elle-même ou une sorte d'incompatibilité entre les types de date utilisés par Spring?

Essayé findByStartDateAfterAndEndDateBefore(Date givenDate, Date givenDate) et qui retourne null cependant.

Vous ne pouvez pas utiliser un seul paramètre à cause des restrictions de Spring Data, mais vous pouvez le contourner en utilisant un code tel que:

List<AnEntity> findByStartDateBeforeAndEndDateAfter(Date startDate, Date endDate);

default List<AnEntity> findByStartDateBeforeAndEndDateAfter(Date givenDate) {
    return findByStartDateBeforeAndEndDateAfter(givenDate, givenDate);
}

Ce code devrait couvrir vos besoins. Je l'ai également vérifié avec Spring Boot 1.5.9. en utilisant exemple spring-data-get-started .

10
Oleksandr Shpota

À ma grande surprise, LessThan et GreaterThan a travaillé et Before et After a échoué.

Je n'ai jamais pensé que je pouvais utiliser moins que et plus grand que pour les dates et toujours regarder les fonctions liées aux dates comme entre, avant, après. 

C'est principalement à cause de l'exemple de documentation 

After

findByStartDateAfter

… where x.startDate > ?1

Before

findByStartDateBefore

… where x.startDate < ?1

J'ai donc examiné de plus près la documentation de Spring Data JPA et trouvé quelque chose d'intéressant avec l'exemple ci-dessous. 

 LocalDate date = new LocalDate().minusYears(2);
 return builder.lessThan(root.get(_Customer.createdAt), date);

Ainsi, lors de la comparaison des dates, les auteurs utilisent les critères lessthan pour la propriété time. 

Donc donné un coup avec moins de et travaillé et encore une fois donné un coup avec plus qu'aswell et plus tard ensemble. Alors je suis venu avec une conclusion 

public MyDateEntity findByStartDateLessThanAndEndDateGreaterThan(Date sDate, Date eDate); 

Et cela fonctionne jusqu'à présent. Et je crois qu'il doit y avoir un moyen propre de traiter les dates probablement avec before,after,between mais je n'arrive pas à comprendre cela. 

Ce serait génial si quelqu'un comprenait ça.

5
Suresh Atta

Vous utilisez la condition AND dans votre requête JPA mais vous ne fournissez qu'un seul paramètre. Vous devriez utiliser comme findByStartDateAfterAndEndDateBefore(Date startDate, Date endDate);

2
Hiren

Etant donné que vous avez seulement besoin de l'objet Date comme équivalent de LocalDate, cela devrait faire l'affaire.

default List<AnEntity> findByStartDateAfterAndEndDateBefore(Date startDate, Date endDate) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(endDate);
    cal.add(Calendar.DATE, -1);
    return findByStartDateBetween(startDate, cal.getTime());
}

Parce que vous voulez qu'il inclue le début, mais pas la fin, et que SQL BETWEEN soit inclusif, nous reportons simplement la fin d'un jour.

2
coladict
    Public List<EntityClass> findData(Date startDate,Date endDate)
   {
     Query<EntityClass> _q = em.createQuery("select a.* from _tableName a 
                         where a.startDate>= :d1 AND a.endDate<= :d2");
    _q.setParameter("d1", startDate, TemporalType.DATE);
    _q.setParameter("d2", endDate, TemporalType.DATE);
    List<EntityClass> result = query.getResultList();
    em.getTransaction().commit();
    return result;
   }
2
DHARMENDRA SINGH

Je l'utilise sans problèmes comme celui-ci:

findAllByEntityNotNullAndDateBetween(Date begin, Date end);

Avez-vous déjà essayé?

0
fabioresner