2016-10-05 18 views
0

私は、T-SQLで次のSQLクエリを持っている:JPA - データベース機能の選択方法

SELECT a.ReportDate, 
    a.Value, 
    a.Quantity, 
    a.ID, 
    a.Code 
FROM AQF.fCalc(@data) a 

@datavarbinaryです。 JPAを使用してこのクエリを複製しようとしています。 (私は実際に春データJPA 1.10.2を使用しています。)私はMyRepositoryに次のように定義されている次のように

@Query("SELECT a " 
     + "FROM function('AQF.fCalc', :data) a " 
     ) 
List<MyClass> getCalcData(@Param("data") byte[] data); 

MyClassは次のとおりです。

@Entity 
@Data // using lombok to create setters, getters, etc. 
public class MyClass { 

    @Id 
    private Long id; 

    private Date reportDate; 
    private BigDecimal value; 
    private BigDecimal quantity; 
    private String code; 

} 

私はgetCalcDataを呼び出すと、私は次のことを受け取りますエラー:

antlr.NoViableAltException: unexpected token: function 
at org.hibernate.hql.internal.antlr.HqlBaseParser.fromRange(HqlBaseParser.java:1501) [hibernate-core-5.0.9.Final.jar:5.0.9.Final]... 

どのように私はJPAを使用して関数を呼び出しAQF.fCalc(とバイト配列を渡す)ことができますか?

アップデート1

私は今、あまりにもネイティブクエリを使用して試してみたが、今私は、エラーを知らせるを得る:

java.sql.SQLException: An error occurred while getting new row from user defined Table Valued Function : 
System.Xml.XmlException: Unexpected end of file has occurred. The following elements are not closed: Data, Report. Line 24, position 804. 

ここMyRepositoryでネイティブクエリのテストコードです:

@Query(value = "SELECT a.code " 
     + "FROM AQF.fCalc(?1) a", 
     nativeQuery = true) 
List<String> getCalcData(byte[] data); 

アップデート2

上記の「アップデート1」に記載されているエラーを解決できました。 getCalcDataのデータのバイト配列が破損していました。その問題を解決すると、エラーは表示されなくなりました。だから、今はネイティブクエリとして実行できます。しかし、私はまだJPQLを使ってこの関数を呼び出す方法を知りたいです。

+0

はそうネイティブクエリhttp://docs.spring.io/spring-data/jpa/docs/current/reference/html/#_native_queries –

+0

OKとしてそれを指定してみてください。コメントありがとう。私はこの記事を参照しました:私はおそらく何かを誤解しているでしょうが、JPQLはJPA 2.1以降のこの構文をサポートしているようです(http://stackoverflow.com/questions/31115100/jpa-query-using-a -d-db-function-to-a-specific-index)を使用します。とにかく、ネイティブクエリを使用するように変更しましたが、今はエラーが表示されませんが、結果が返されません。 – James

+0

申し訳ありませんが、結果が出ないという問題が見つかりました。さて、私は上記の更新された投稿に記載されているエラーを取得します。 – James

答えて

0

あなたはStoredProcedureQueryを使用することができます。 javadoc

Interface used to control stored procedure query execution.

からこのサンプルコードを参照してください。

この例では、SQL関数名はsales_taxです。有効なJPQLではありません

 EntityManager em = factory.createEntityManager(); 

     // Create call stored procedure 
     em.getTransaction().begin(); 
     StoredProcedureQuery storedProcedure = em.createStoredProcedureQuery("sales_tax"); 
     // set parameters 
     storedProcedure.registerStoredProcedureParameter("subtotal", Double.class, ParameterMode.IN); 
     storedProcedure.registerStoredProcedureParameter("tax", Double.class, ParameterMode.OUT); 
     storedProcedure.setParameter("subtotal", 1f); 
     // execute SP 
     storedProcedure.execute(); 
     // get result 
     Double tax = (Double)storedProcedure.getOutputParameterValue("tax"); 
     System.out.println("Tax is: " + tax); 
     em.getTransaction().commit(); 
     em.close(); 
+0

私はselectステートメントで関数を使用する必要があります。この関数はテーブルを返します。ストアドプロシージャコールがどのように機能するかはわかりません。 – James

+0

関数はstoreprocedureの別の名前です –

+0

私はOPで自分の質問を解決するためにどのように使用しますか?この関数はテーブルを返します。私はあなたがoutパラメータの型を定義する方法がはっきりしていません。 – James