2011-08-01 9 views
4

これは、過去のquestionのものに関連しています。無効な列型〜送信ArrayList <String>をpl/sql createdNameQueryに

私はList<Employee>を受信し、EmployeeオブジェクトからIDをつかみ、その後、createdNameQueryのパラメータとしてArrayListことを送るArrayList<String>でそれらを入れています。無効な列型SQL例外が表示されます。私はpl/sql開発者でクエリをテストし、フィールドを返しました。私は各IDの間に昏睡状態を置き、それを送信することによってIDの文字列を構築しようとしましたが、その試みから例外がありました。クエリの設定が間違っているか、データを間違って送信しているのが不思議です。私のリポジトリ内

機能:

public List<RequestByRequester> getRequestsByRequesters(
     List<Employee> employeeList) 
     throws NoDataFoundException { 

    List<String> idList = new ArrayList<String>(); 
    for(Employee emp : employeeList) {   
     idList.add(emp.getId().toString()); 
    } 

    log.debug("Input params[requesters=" + idList + "]"); 

    List<RequestByRequester> resultList = getEm().createNamedQuery(
      "requestByRequestor.getRequestsByRequesters", RequestByRequester.class) 
      .setParameter(1,idList) 
      .getResultList(); 

     if(resultList == null || resultList.size() <= 0) 
      throw new NoDataFoundException("No requests found by requesters."); 
     else 
      return resultList; 
} 

私の名前付きクエリrequestByRequestor.getRequestsByRequesters以下

@NamedNativeQuery(
    name = "requestByRequestor.getRequestsByRequesters", 
    resultClass = RequestByRequester.class, 
    query = "SELECT EMP.EMPL_FIRST_NAME || ' ' || EMP.EMPL_LAST_NAME REQUESTER," + 
      "  R.RQST_ID RQST_ID," + 
      "  R.TITLE TITLE," + 
      "  R.DESCRIPTION DESCRIPTION," + 
      "  DECODE(R.RESOLUTION_DATE, NULL, 'Open', 'Closed') STATUS" + 
      " FROM TARTS.REQUESTS R, SYS_EMPLOYEES EMP" + 
      " WHERE R.EMPL_ID_REQUESTED_BY = EMP.EMPL_ID" + 
      " AND EMP.EMPL_ID IN (?)" + 
      " ORDER BY 1, 5 DESC, 2" 
    ) 

EDIT:要求されたような例外を追加します。

この例外私はクエリで:idsを使用します。

Internal Exception: java.sql.SQLException: Missing IN or OUT parameter at index:: 1 Error Code: 17041 Call: SELECT EMP.EMPL_FIRST_NAME || ' ' || EMP.EMPL_LAST_NAME REQUESTER, R.RQST_ID RQST_ID, R.TITLE TITLE, R.DESCRIPTION DESCRIPTION, DECODE(R.RESOLUTION_DATE, NULL, 'Open', 'Closed') STATUS FROM TARTS.REQUESTS R, SYS_EMPLOYEES EMP WHERE R.EMPL_ID_REQUESTED_BY = EMP.EMPL_ID AND EMP.EMPL_ID IN :ids ORDER BY 1, 5 DESC, 2 Query: ReadAllQuery(name="requestByRequestor.getRequestsByRequesters" referenceClass=RequestByRequester sql="SELECT EMP.EMPL_FIRST_NAME || ' ' || EMP.EMPL_LAST_NAME REQUESTER, R.RQST_ID RQST_ID, R.TITLE TITLE, R.DESCRIPTION DESCRIPTION, DECODE(R.RESOLUTION_DATE, NULL, 'Open', 'Closed') STATUS FROM TARTS.REQUESTS R, SYS_EMPLOYEES EMP WHERE R.EMPL_ID_REQUESTED_BY = EMP.EMPL_ID AND EMP.EMPL_ID IN :ids ORDER BY 1, 5 DESC, 2")

例外私は、クエリに?1または(?)を使用します。

Internal Exception: java.sql.SQLException: Invalid column type Error Code: 17004 Call: SELECT EMP.EMPL_FIRST_NAME || ' ' || EMP.EMPL_LAST_NAME REQUESTER, R.RQST_ID RQST_ID, R.TITLE TITLE, R.DESCRIPTION DESCRIPTION, DECODE(R.RESOLUTION_DATE, NULL, 'Open', 'Closed') STATUS FROM TARTS.REQUESTS R, SYS_EMPLOYEES EMP WHERE R.EMPL_ID_REQUESTED_BY = EMP.EMPL_ID AND EMP.EMPL_ID IN ? ORDER BY 1, 5 DESC, 2 bind => [[2192, 632]] Query: ReadAllQuery(name="requestByRequestor.getRequestsByRequesters" referenceClass=RequestByRequester sql="SELECT EMP.EMPL_FIRST_NAME || ' ' || EMP.EMPL_LAST_NAME REQUESTER, R.RQST_ID RQST_ID, R.TITLE TITLE, R.DESCRIPTION DESCRIPTION, DECODE(R.RESOLUTION_DATE, NULL, 'Open', 'Closed') STATUS FROM TARTS.REQUESTS R, SYS_EMPLOYEES EMP WHERE R.EMPL_ID_REQUESTED_BY = EMP.EMPL_ID AND EMP.EMPL_ID IN ? ORDER BY 1, 5 DESC, 2")

+0

を意味することになっ用語BYそれらORDERは何ですか? result_variableではなく、state_field_path_expressionでもありません。 4.9 JPA仕様のセクションを読むことを提案する。結果の式を順序で使用する場合は、別名「SELECT something AS p」を使用し、次に「p」を参照することができます。代わりにこれをSQLとして指定した場合、クエリー生成に間違ったメソッドを使用しています – DataNucleus

+0

名前付きクエリ定義を含める – James

+0

@Jamesそれはテキストの下に含まれています** requestByRequestor.getRequestsByRequesters ** –

答えて

1

名前付きクエリの定義が含まれていないため、ネイティブSQLクエリを実行していて、Listが有効なSQL/JDBCパラメータ値ではないということです。

EclipseLinkサポートJPQLクエリのパラメータをリストしますが、ネイティブSQLクエリのパラメータはリストしません。

あなたのSQLのパラメータのそれぞれをJPQLを使用し、または定義するいずれかの必要がある

すなわち

EMP.EMPL_ID IN (:id1, :id2, :id3) 

.setParameter("id1", idList.get(0)); 
.setParameter("id2", idList.get(1)); 
+0

あなたの前のコメントへの返答として私が言及したように。私の名前付きの質問は私の元の投稿にあります。例外のリストの上を見てください。それは行の上にあります**編集:要求として例外を追加する** –

+0

私はあなたが正しいと思います。 JPQLクエリを使用する必要があります。ありがとう! –

0

私は問題がここにあると思い

AND EMP.EMPL_ID IN (?) 

位置パラメータを示すには、数字に接尾辞を付ける必要があります。

AND EMP.EMPL_ID IN (?1) 

代わりに、あなたは

AND EMP.EMPL_ID IN (:empIds) 

を行うと、そのように

List<RequestByRequester> resultList = getEm().createNamedQuery(
     "requestByRequestor.getRequestsByRequesters", RequestByRequester.class) 
     .setParameter("empIds", idList) 
     .getResultList(); 
+0

私は 'AND EMP.EMPL_ID IN(?1)'アプローチを試して、無効な列エラーを受け取りました。私が 'AND EMP.EMPL_ID IN(:empIds)'アプローチを試みたとき、私はこの '内部例外:java.sql.SQLException:インデックスにINまたはOUTパラメータがありません 'というエラーを受け取りました。 –

0

クエリのようなクエリを呼び出すことができます。

List<RequestByRequester> resultList = getEm().createNamedQuery(
    "requestByRequestor.getRequestsByRequesters", RequestByRequester.class) 
    .setParameter("ids", idList) 
    .getResultList(); 

NamedQuery一部:

WHERE R.EMPL_ID_REQUESTED_BY = EMP.EMPL_ID 
AND EMP.EMPL_ID IN :ids 

注意::idsは角かっこなしです。これはうまくいくはずです。あなたのコードで

+0

私はそれを括弧なしで試して、 '内部例外:java.sql.SQLException:インデックスにINまたはOUTパラメータがありませんでした。 'を受け取りました。 –

0

あなたは文字列

List<String> idList = new ArrayList<String>(); 
    for(Employee emp : employeeList) {   
     idList.add(emp.getId().toString()); 
    } 

にemp.getIdを()にマッピングされている。しかし、私はこのコラムEMP.EMPL_IDための型が数値または一部のようなものである賭けます。実行するとき

.setParameter("empIds", idList) 

JPAは引用符とエスケープ文字などを含む文字列値に変換します。それゆえ:

ます。java.sql.SQLException:無効な列タイプ

List<Long>または他のいくつかの数値型へのマッピングをしてみてください。

+0

EMP.EMPL_IDがLongで、リストを試してみました。これまでと同じ結果が得られました。 –

+0

SqlResultSetMappingを使用しているか、NamedQuery(requestByRequestor.getRequestsByRequesters)でResultClassを指定していますか? –

+0

これは特定のResultClass 'RequestByRequester'です –

関連する問題