web-dev-qa-db-fra.com

Fonctions JPM Query MONTH/YEAR

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.

15
venomrld

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.

23
James

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.

6
amrodelas

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).

3
Pascal Thivent

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 ")

1
suraj bahl