15

spring data JPAを使用して、この種のクエリを作成しようとしています(より複雑です。これは単純なケースです)

@Query(nativeQuery = true, 
       value = "SELECT * FROM events WHERE typeId IN (?1)")
List<Event> findEventsByType(List<Integer> types);

クエリを起動すると、例外が発生します。

org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of java.util.ArrayList. Use setObject() with an explicit Types value to specify the type to use.

List < Integer >、Integer[]、Object[]、および String を試しましたが、機能しません...

値のリストを渡すことはできませんか?

この種のクエリを作成するための最良のアプローチはどれですか?

ありがとう!

4

9 に答える 9

13

@Query を取り除いて、メソッド名を作成してみてください。

public List<Event> findByTypeIn(List<Integer> types);

リンクの表 2.2 を参照してください: http://docs.spring.io/spring-data/jpa/docs/1.2.0.RELEASE/reference/html/

于 2013-10-25T13:56:27.667 に答える
5

JPQLを使用します。ネイティブ クエリは、SQL 文字列を作成したときとまったく同じようにデータベースに渡されるか、渡される必要があります。ドライバーがシリアル化されたコレクションを取得し、単一のパラメーターを多くのパラメーターとして解釈する必要があることを理解できない限り、それは機能しません。渡すコレクションには、コレクション内の要素の数に基づいて (?) から (?, ?,...) に拡張された SQL が必要ですが、JDBC ドライバーはこれを行うことができず、JPA プロバイダーはこれを行う必要があります。文字列をそのまま実行します。

JPQL クエリを使用すると、JPA プロバイダーは、渡されたリストに基づいて必要な SQL を動的に作成できるため、コレクションを拡張できます。

于 2013-10-25T15:02:59.327 に答える
1

これは少し文脈から外れていることを知っています(選択ではなく更新を使用します)が、これは他の人にとっては便利です:


    /**
     * Update the state of list of entities using their ids
     * @param ids request ids
     * @param state new state
     * @return
     */
    @Modifying
    @Query(value = "UPDATE AbstractRequest SET state = :state WHERE id IN (:ids)")
    int updateStates(@Param("ids") List<Long> ids, @Param("state") InternalRequestStep state);
于 2019-11-13T15:33:18.037 に答える
0

IN句内でこの方法で配列を渡します

@Query(value = "select name from teams where name in :names", nativeQuery = true)
List<String> getNames(@Param("names") String[] names);

こっちに電話

String[] names = {"testing team","development team"};
List<String> teamtest = teamRepository.getNames(names);
于 2019-09-19T11:26:07.357 に答える