Comment puis-je écrire une requête JPA en utilisant la fonction MONTH
, tout comme une requête SQL?
@NamedQuery(name="querybymonth", query="select t from table1 t where MONTH(c_Date) = 5")
Lorsque j'utilise le modèle ci-dessus pour une requête, j'obtiens une erreur: unexpected token - MONTH
.
Si vous utilisez EclipseLink (2.1), vous pouvez utiliser la fonction FUNC () pour appeler toute fonction de base de données non définie dans les spécifications JPA JPQL.
i.e. FUNC ('MOIS', c_Date)
Dans JPA 2.1 (EclipseLink 2.5), la syntaxe FONCTION devient partie intégrante de la spécification (et remplace le FUNC spécifique à EclipseLink).
Si vous utilisez TopLink Essentials, vous ne pouvez pas le faire dans JPQL, mais vous pouvez définir une requête d’expression TopLink (similaire aux critères JPA 2.0) ou utiliser du code SQL natif.
De même, si vous utilisez un fournisseur JPA 2.0 et une requête Criteria, une API function () peut être utilisée pour définir cela.
Je veux interroger YEAR (itemDate) mais la fonction ne se ferme pas, alors j'ai vu la fonction SUBSTRING (), donc ce que j'ai fait était Select q from table where SUBSTRING(itemDate, 1, 4)='2011'
Et cela fonctionne pour moi! J'espère que ça aide!
si vous avez besoin d'une variable dynamique, vous pouvez aussi le faire. ici: poDate est l'année définie dans setParameter ();
@NamedQuery(name = "PurchaseOrders.findByYear", query = "SELECT p FROM PurchaseOrders p WHERE SUBSTRING(p.poDate, 1, 4) = :poDate")
Query q = em.createNamedQuery("PurchaseOrders.findByYear");
q.setParameter("poDate", s_year+"");
mais si vous êtes d'accord avec vos solutions, ça ira. Je viens de trouver JPA plus rapide à exécuter.
La fonction MONTH()
existe dans Hibernate HQL mais n’est pas une fonction JPA standard. Votre fournisseur JPA a peut-être un équivalent propriétaire, mais vous ne l'avez pas mentionné. Si ce n'est pas le cas, utilisez SQL natif.
J'utilise Toplink Essentials pour la même chose. S'il vous plaît aider, si une fonction existe dans Toplink. Merci.
À ma connaissance, TopLink n’a pas d’équivalent direct. Utilisez donc une requête SQL native ou peut-être une requête d’expression TopLink (vous n’êtes pas sûr de cela et vous ne savez pas si cela est disponible dans TopLink Essentials).
Après travaillé pour moi avec hiberner (4.3.9.Final) & JPA 2.1.
@NamedQuery (name = "PartyEntity.findByAID", query = "sélectionnez une psc.party distincte dans PartyShortCode psc où (psc.shortCode =: aidNumber ou FUNCTION ('REMPLACE', psc.accountReference, '', '') =: aidNumber) et psc.sourceSystem dans: sourceSystem ")