SQLクエリと同じようにMONTH
関数を使用してJPAクエリを作成するにはどうすればよいですか?
@NamedQuery(name="querybymonth", query="select t from table1 t where MONTH(c_Date) = 5")
上記のパターンをクエリに使用すると、エラーが発生します:unexpected token - MONTH
。
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があります。
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の実行が速いと思います。
MONTH()
関数はHibernateHQLに存在しますが、標準のJPA関数ではありません。たぶんあなたのJPAプロバイダーはいくつかの独自の同等物を持っていますが、あなたはそれについて言及しませんでした。そうでない場合は、ネイティブSQLにフォールバックします。
同じようにToplinkEssentialsを使用しています。 Toplinkに機能が存在する場合は、助けてください。ありがとう。
私の知る限りでは、TopLinkに直接同等のものはありません。したがって、ネイティブSQLクエリまたはTopLink式クエリを使用します(これについては不明であり、TopLink Essentialsで使用できるかどうかも不明です)。
以下は、休止状態(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 ")