Spring Data JPA(JPAプロバイダーとしてHibernateを使用)を使用しており、HQLクエリを添付したexists
メソッドを定義したい:
public interface MyEntityRepository extends CrudRepository<MyEntity, String> {
@Query("select count(e) from MyEntity e where ...")
public boolean existsIfBlaBla(@Param("id") String id);
}
このクエリを実行すると、Java.lang.ClassCastException: Java.lang.Long cannot be cast to Java.lang.Boolean
が返されます。
この機能を実現するには、HQLクエリはどのように見える必要がありますか?単にLong値を返し、その後count > 0
であればJavaコードをチェックインできますが、その回避策は必要ないはずですよね?
クエリを変更してブール値を返すことができると思います
@Query("select count(e)>0 from MyEntity e where ...")
PS:主キーの値CrudRepository
に基づいて存在することを確認する場合は、exists(id)
メソッドが既にあります。
Spring Data JPA 1.11は、リポジトリクエリ派生でexists
プロジェクションをサポートするようになりました。
ドキュメントを参照してください こちら 。
あなたの場合、以下が機能します:
public interface MyEntityRepository extends CrudRepository<MyEntity, String> {
boolean existsByFoo(String foo);
}
私の場合、次のようには機能しませんでした
@Query("select count(e)>0 from MyEntity e where ...")
次のようにブール値として返すことができます
@Query(value = "SELECT CASE WHEN count(pl)> 0 THEN true ELSE false END FROM PostboxLabel pl ...")
Springデータ1.12以降、QueryByExampleExecutor
インターフェイスを拡張することにより、関数の例によるクエリを使用できます(JpaRepository
alreadyはそれを拡張します)。
次に、このクエリを使用できます(特に)。
<S extends T> boolean exists(Example<S> example);
エンティティMyEntity
を考えます。プロパティname
として、大文字と小文字を無視して、その名前のエンティティが存在するかどうかを知りたい場合、このメソッドの呼び出しは次のようになります。
//The ExampleMatcher is immutable and can be static I think
ExampleMatcher NAME_MATCHER = ExampleMatcher.matching()
.withMatcher("name", GenericPropertyMatchers.ignoreCase());
Example<MyEntity> example = Example.<MyEntity>of(new MyEntity("example name"), NAME_MATCHER);
boolean exists = myEntityRepository.exists(example);
受け入れられた答えとは別に、私は別の代替案を提案しています。 QueryDSL を使用して、述語を作成し、述語を受け入れてブール値を返すexists()
メソッドを使用します。
QueryDSLの利点の1つは、複雑なwhere句に述語を使用できることです。
以下のように、選択クエリでCase
を返すためにboolean
式を使用できます。
@Query("SELECT CASE WHEN count(e) > 0 THEN true ELSE false END FROM MyEntity e where e.my_column = ?1")