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)]
私はついに@Query
アノテーションなしで簡単な解決策を見つけ出すことができました。
List<People> findDistinctByNameNotIn(List<String> names);
もちろん、文字列だけではなくピープルオブジェクトを取得しました。その後、Javaで変更を行うことができます。
このようにクエリを言い換えてみましたか?
@Query("SELECT DISTINCT p.name FROM People p WHERE p.name NOT IN ?1")
List<String> findNonReferencedNames(List<String> names);
注、エンティティクラスの名前はPeople
ではなくpeople
であると仮定しています。
@Query("SELECT DISTINCT name FROM people WHERE name NOT IN (:names)")
List<String> findNonReferencedNames(@Param("names") List<String> names);
このように使用できませんか?
@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
を無視できます。
データベース名が正しくマップされていないようです(質問を更新した後)