web-dev-qa-db-ja.com

JPAとSpringを使用してリスト内のフィールドを持つ個別の行を見つける方法は?

Springを使用してデータベースに接続しています。 CrudRepository<People, Long>を拡張するインターフェイスがあります。dbで実行するクエリは次のとおりです:SELECT DISTINCT name FROM people WHERE name NOT IN UserInputSet。私はSQLアノテーションなしでそれを行うことを好むので、NOTなしで可能であれば大丈夫です。

それを行う方法はありますか?私は春のドキュメントを見ましたが、何も見つかりません( http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-作成


これは私が疲れたものですが、動作していません。

@Query("SELECT DISTINCT name FROM people WHERE name NOT IN (?1)")
List<String> findNonReferencedNames(List<String> names);

これは私が得る例外です:

Error creating bean with name 'peopleRepository': Invocation of init method failed; nested exception is Java.lang.IllegalArgumentException: Validation failed for query for method public abstract Java.util.List de.test.tasks.persistence.PeopleRepository.findNonReferencedNames(Java.util.List)!

そして

Caused by: Java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: people is not mapped [SELECT name FROM people WHERE name NOT IN (?1)]
23
Paul Fournel

私はついに@Queryアノテーションなしで簡単な解決策を見つけ出すことができました。

List<People> findDistinctByNameNotIn(List<String> names);

もちろん、文字列だけではなくピープルオブジェクトを取得しました。その後、Javaで変更を行うことができます。

48
Paul Fournel

このようにクエリを言い換えてみましたか?

@Query("SELECT DISTINCT p.name FROM People p WHERE p.name NOT IN ?1")
List<String> findNonReferencedNames(List<String> names);

注、エンティティクラスの名前はPeopleではなくpeopleであると仮定しています。

13
pioto
@Query("SELECT DISTINCT name FROM people WHERE name NOT IN (:names)")
List<String> findNonReferencedNames(@Param("names") List<String> names);
3
aviv zvi

このように使用できませんか?

@Query("SELECT DISTINCT name FROM people p (nolock) WHERE p.name NOT IN (:myparam)")
List<String> findNonReferencedNames(@Param("myparam")List<String> names);

追伸SQL Server 2012でクエリを頻繁に作成します。サーバーでnolockを使用することをお勧めします。ローカルデータベースが使用されている場合は、nolockを無視できます。

データベース名が正しくマップされていないようです(質問を更新した後)

1
ha9u63ar