2010-05-19 3 views
1

je dois écrire une requête pour obtenir un objet entre une plage de temps, actuellement la requête ressemble à ceci:HQL (veille prolongée) Plage d'horodatage correspondance

Timestamp from = ... 
Timestamp to = ... 

getHibernateTemplate().find("from " + Person.class.getName() + " ml where ml.lastModifiedOn>="+from.toString()+" and m1.lastModifiedOn<=" + to.toString()); 

Cependant, ce travail de doesnot pour Des raisons évidentes. Comment puis-je formater l'horodatage pour être acceptable par la requête.

org.springframework.orm.hibernate3.HibernateQueryException: jeton inattendu: 16 près de la ligne 1, colonne 123 [ml de personne où ml.lastModifiedOn> = 12/02/2010 16: 00: 21,292 et m1.lastModifiedOn
+0

essayer aaaa-MM-JJ HH: MM: SS – Inv3r53

+0

ne fonctionne pas. . – Saky

Répondre

3

Il vous manque des guillemets simples dans votre requête actuelle. Ce qui suit devrait fonctionner:

from Person ml where ml.lastModifiedOn 
between '2010-02-12 16:00:21.292' and '2010-02-12 23:00:21.292' 

Notez que je ne sais pas pourquoi vous n'êtes pas passer Date instances à la requête suivante:

from Person ml where ml.lastModifiedOn between :from and :to 

Utilisez-vous java.sql.Timestamp ici? Si oui, vous ne devriez pas.

+0

Oui, j'utilise Timestamp essentiellement tout au long du projet, et bien que cela fonctionne: Timestamp from = ..; Horodatage à = ..; DetachedCriteria criteria = DetachedCriteria.forClass (Person.class); criteria.add (Restrictions.between ("lastModifiedOn", from, to)); Liste results = getHibernateTemplate(). FindByCriteria (critères); – Saky

2

Vous pouvez simplement passer un long (from.getTime()) dans la comparaison, s'il est représenté aussi longtemps dans le DB.

Sinon, vous pouvez utiliser ces functiomns: second(...), minute(...), hour(...), day(...), month(...), and year(...)

+1

Dans la base de données, il est représenté comme DATETIME et pas aussi long. Comment utiliser ces fonctions pour une correspondance datetime complète? – Saky

1

Que diriez-vous quelque chose comme ça?

String sql = "from " + Person.class.getName() + " ml where ml.lastModifiedOn>= ? and m1.lastModifiedOn<= ?"; 
    Date from = ...; 
    Date to = ...; 

    getHibernateTemplate().find(sql, new Object[] {from,to}); 
+0

J'ai essayé et j'ai une erreur. [ERREUR] 13:58:03 PARSER - chemin non valide: 'm1.lastModifiedOn' [ERREUR] 13:58:03 PARSER - : 0: 0: fin inattendue de sous-arbre [ERREUR] 13:58:03 PARSER - l'opérande gauche d'un opérateur binaire était null org.springframework.orm.hibernate3.HibernateQueryException: Chemin non valide: 'm1.lastModifiedOn' [à partir de it.Person ml où ml.lastModifiedOn> =? et m1.lastModifiedOn <=?]; l'exception imbriquée est org.hibernate.hql.ast.QuerySyntaxException: Chemin non valide: 'm1.lastModifiedOn' [from it.Person ml où ml.lastModifiedOn> =? et m1.lastModifiedOn <=?] ... étrange! – Saky

0

Si vous souhaitez interroger quelque chose entre vous pouvez effectuer les opérations suivantes:

public List findPerson() { 
    Date from = ...; 
    Date to = ...; 
    return entityManager.createQuery(
    "SELECT p from Person p WHERE p.lastModifiedOn BETWEEN ?1 AND ?2") 
    .setParameter(1,from, TemporalType.DATE) 
    .setParameter(2,to, TemporalType.DATE).getResultList(); 
} 

Vous devrez peut-être changer TemporalType.DATE à ce que vous utilisez

Questions connexes