web-dev-qa-db-ja.com

JPAクエリのMONTH / YEAR関数

SQLクエリと同じようにMONTH関数を使用してJPAクエリを作成するにはどうすればよいですか?

@NamedQuery(name="querybymonth", query="select t from table1 t where MONTH(c_Date) = 5")

上記のパターンをクエリに使用すると、エラーが発生します:unexpected token - MONTH

15
jagbandhuster

EclipseLink(2.1)を使用している場合は、FUNC()関数を使用して、JPAJPQL仕様で定義されていないデータベース関数を呼び出すことができます。

つまり、FUNC( 'MONTH'、c_Date)

JPA 2.1(EclipseLink 2.5)では、 [〜#〜] function [〜#〜] 構文が仕様の一部になります(EclipseLink固有のFUNCに置き換わります)。

TopLink Essentialsを使用している場合、JPQLでこれを行うことはできませんが、(JPA 2.0基準と同様に)TopLink式クエリを定義するか、ネイティブSQLを使用できます。

また、JPA 2.0プロバイダーを使用していて、Criteriaクエリを使用している場合は、これを定義するために使用できるfunction()APIがあります。

23
James

YEAR(itemDate)をクエリしたいのですが、関数が終了しません。SUBSTRING()関数が表示されたので、Select q from table where SUBSTRING(itemDate, 1, 4)='2011'を実行しましたが、機能します。それが役に立てば幸い!

動的変数が必要な場合は、それも可能です。ここで:poDateは、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+"");

しかし、ソリューションに問題がなければ、それで問題ありません。 JPAの実行が速いと思います。

7
amrodelas

MONTH()関数はHibernateHQLに存在しますが、標準のJPA関数ではありません。たぶんあなたのJPAプロバイダーはいくつかの独自の同等物を持っていますが、あなたはそれについて言及しませんでした。そうでない場合は、ネイティブSQLにフォールバックします。


同じようにToplinkEssentialsを使用しています。 Toplinkに機能が存在する場合は、助けてください。ありがとう。

私の知る限りでは、TopLinkに直接同等のものはありません。したがって、ネイティブSQLクエリまたはTopLink式クエリを使用します(これについては不明であり、TopLink Essentialsで使用できるかどうかも不明です)。

3
Pascal Thivent

以下は、休止状態(4.3.9。最終)およびJPA2.1で動作しました。

@NamedQuery(name = "PartyEntity.findByAID"、query = "PartyShortCode pscから個別のpsc.partyを選択しますwhere(psc.shortCode =:aidNumber or FUNCTION( 'REPLACE'、psc.accountReference、 ''、 '' ) =:aidNumber)およびpsc.sourceSystem in:sourceSystem ")

1
suraj bahl