2017-04-06 10 views
0

では無効に入力します。 列は、これが私のリポジトリですNATIVEクエリJPQL

@Repository 
public interface EventRepository extends JpaRepository<Events, Long>, JpaSpecificationExecutor<Events>{ 

    @Query(value=" SELECT DISTINCT event.EVENT_ID " 
       + "FROM EVENTS event " 
       + "JOIN EVENTS event2 " 
       + "ON event.EVENT_ID = event2.PARENT_ID " 
       + "WHERE event.ENTITY_ID IN (?1)", nativeQuery = true) 
    List<Long> getDescendantEventIdInEntityId(Set<Long> descendantEntities); 
} 

なぜ、このメソッドが呼び出されたとき、それはリターンです: 内部例外:java.sql.SQLExceptionを:ティポ・ディ・コロンナ非valido エラーコード:17004 コール:EVENTSイベントからDISTINCT event.EVENT_IDをSELECT、JOIN EVENTSイベント2 ON event.EVENT_ID = event2.PARENT_ID event.ENTITY_ID、IN バインド=> [[1]]と間違っているものを

(?)クエリ? クエリが正常であれば、その "bind => [[1]]"は本当の問題ですか?はいの場合、角括弧が多すぎるのはなぜですか?

私もこのソリューション試してみた:

@Query(value=" SELECT DISTINCT event2.EVENT_ID " 
       + "FROM EVENTS event " 
       + "JOIN EVENTS event2 " 
       + "ON event.EVENT_ID = event2.PARENT_ID " 
       + "WHERE event.ENTITY_ID IN :entitiesId", nativeQuery = true) 
    List<Long> getDescendantEventIdInEntityId(@Param("entitiesId") Set<Long> entitiesId); 

を、それは私に別のエラーを返す:17041 コール:DISTINCT event2.EVENT_IDをSELECTインデックス:: 1つの エラーコードで 欠落INまたはOUTパラメータをentitiesId

SOLUTION:EntityManagerのから新しいnativeQueryを作成解決:

EVENTSイベントからイベントイベント2 ON event.EVENT_ID = event2.PARENT_ID event.ENTITY_ID INが登録しよう

ここで、idListはStringUtils.join(CollectionOfId、 "、")によって作成されたストリングです。

答えて

2

JPAプロバイダとしてHibernateが使用されている場合、位置パラメータバインディング(?1)ではなく、名前付きパラメータバインド(:parameterName)を使用することもできます。これにより、エラーが発生しにくくなり、大括弧を省略し、Springがあなたのための構文を管理できるようになります。また、あなた自身で何かを解析する必要はありません。

使用という名前のパラメータのような結合:

@Query(value="SELECT DISTINCT event2.EVENT_ID " 
     + "FROM EVENTS event " 
     + "JOIN EVENTS event2 " 
     + "ON event.EVENT_ID = event2.PARENT_ID " 
     + "WHERE event.ENTITY_ID IN :entityIds", nativeQuery = true) 
List<Long> getDescendantEventIdInEntityId(@Param("entityIds") Set<Long> ids); 

は両方のケースでは、メソッドにnullまたは空のセットを渡すのに注意してください!それは予期しない結果を引き起こす可能性があります。

悲しいことに、名前付きパラメータはJPA標準ではなく、EclipseLinkでは(このように)サポートしていない可能性があります。次に、位置パラメータを指定する必要があります。

+0

私はすでにこのソリューションを試しましたが、別のタイプのエラーを返します。 更新された質問を確認してください – Innet

+0

Paramアノテーションの完全修飾語を教えてください。それはorg.springframework.data.repository.query.Paramですか?あなたのケースでは、渡された価値が見当たりません。 –

+0

これはparamアノテーションのインポート行です。 _import org.springframework.data.repository.query.Param; _ 値がnullではないことを確信しています – Innet

関連する問題