2017-05-08 1 views
0

Je recevais exception java tout en fixant la valeur des mois:J'essaie d'aller chercher des commandes pour les "N" derniers mois. Dans la requête suivante, je dois définir dynamiquement la valeur pour les mois

SELECT * 
    FROM {Order} 
WHERE creationtime >= NOW() 
    AND creationtime <= DATE_SUB(NOW(), INTERVAL ?months MONTH) 

Cependant cette requête fonctionne correctement dans une base MySQL.

expection trace:

ERREUR [hybrisHTTP34] [FlexibleSearch] Erreur de recherche flexible est survenue ... 8 mai 2017 13:53:18 org.apache.catalina.core.StandardWrapperValve invoquez GRAVES: Servlet .service() pour servlet [DispatcherServlet] dans le contexte avec le chemin [/ jafrastorefront] a lancé l'exception [Demande de traitement a échoué; l'exception imbriquée est de.hybris.platform.servicelayer.search.exceptions.FlexibleSearchException: erreur de recherche SQL - activer la propriété 'flexible.search.exception.show.query.details' pour plus de détails] avec la cause principale org.hsqldb.HsqlException : jeton inattendu: ?

+0

Quelle exception java? Une telle élaboration n'a aucun sens. – Blank

+0

que faites-vous en justice? PreparedStatement ou hibernate? dans le premier cas, il devrait être juste '?', dans le dernier cas - il devrait être '?' ou ': mois' – Alexey

+0

La condition de votre requête est erronée. Il a creationtime> = NOW() ce qui signifie le futur. – fredt

Répondre

0

Vous n'êtes pas sûr de l'exception java, mais logique, vous avez ce problème.

Si NOW() est 5th May, DATE_SUB(NOW(),INTERVAL 1 MONTH) sera 5th April, vous sélectionnez les enregistrements > 5th May et < 5th April en même temps. Par conséquent, vous n'obtiendrez aucun résultat. Utilisez entre pour éviter toute confusion, utilisez BETWEEN.

SELECT * FROM {Order} 
WHERE creationtime BETWEEN 
    DATE_SUB(NOW(), INTERVAL 1 MONTH) 
AND 
    NOW() 
0

Si vous souhaitez obtenir des données pour les mois 'N', vous pouvez directement utiliser la requête suivante.

where creationtime>= (CURDATE() - INTERVAL 1 month) 

dans Java suivant devrait fonctionner.

SELECT * 
    FROM {Order} 
WHERE creationtime>= (CURDATE() - INTERVAL ? month) 
0

La syntaxe SQL est HSQLDB

SELECT * FROM "Order" 
WHERE creationtime >= NOW() - CAST(? AS INTERVAL MONTH)